执行线程的问题

lttleboy 2008-07-17 09:42:34
private void btnStart_Click(object sender, EventArgs e)
{
Thread threadTwo = new Thread(new ThreadStart(MsgTwo));
threadTwo.Start();

}
public void MsgTwo()
{
ListViewBind();
}

private void ListViewBind()
{
Thread.Sleep(1000);

listView2.Items.Clear();
listView2.Columns.Clear();
SqlConnection con = new SqlConnection("server=.;database=pubs;user id=sa;password=123");
con.Open();
DataSet dst = new DataSet();
SqlCommand cmd = new SqlCommand("select title_id,type from titles", con);
SqlDataAdapter dap = new SqlDataAdapter(cmd);
dap.Fill(dst);
/con.Close();

this.listView2.Columns.Add("调用接口", 80, HorizontalAlignment.Center);
this.listView2.Columns.Add("成功数", 80, HorizontalAlignment.Center);//增加列标题
this.listView2.Columns.Add("失败数",80,HorizontalAlignment.Center);

listView2.View = View.Details;
listView2.GridLines = true;//显示网格线。。
string[] str1 = new string[3];
foreach (DataRow row in dataset.Tables[0].Rows)
{
str1[0] = row["Interface"].ToString();
str1[1] = row["sucnum"].ToString();
str1[2] = row["failnum"].ToString();
ListViewItem item = new ListViewItem(str1, 0);
listView2.Items.Add(item);
}
}

为什么运行的时候会出现 线程间操作无效: 从不是创建控件“listView2”的线程访问它。这是怎么回事?在线程中绑定listview该怎么做?
...全文
179 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhy0611 2008-07-17
  • 打赏
  • 举报
回复
这个嘛,不调试的时候不会出这个错误的,你只要在你操作的线程中创建这个控件就OK了
caicai_45 2008-07-17
  • 打赏
  • 举报
回复
好像在线程中访问控件是有问题的,需要用控件的invoke方法
skison 2008-07-17
  • 打赏
  • 举报
回复
ListViewBind()方法是运行在非主线程中,在非主线程中,是不建议操作界面控件的。
也就是说 在ListViewBind中直接操作ListView不行。

需要改下

private void ListViewBind()
{
Thread.Sleep(1000);
if ( this.InvokeRequired )
{
this.Invoke( new MethodInvoker( ListViewBind ) );
}
else
{
listView2.Items.Clear();
listView2.Columns.Clear();
SqlConnection con = new SqlConnection("server=.;database=pubs;user id=sa;password=123");
con.Open();
DataSet dst = new DataSet();
SqlCommand cmd = new SqlCommand("select title_id,type from titles", con);
SqlDataAdapter dap = new SqlDataAdapter(cmd);
dap.Fill(dst);
/con.Close();

this.listView2.Columns.Add("调用接口", 80, HorizontalAlignment.Center);
this.listView2.Columns.Add("成功数", 80, HorizontalAlignment.Center);//增加列标题
this.listView2.Columns.Add("失败数",80,HorizontalAlignment.Center);

listView2.View = View.Details;
listView2.GridLines = true;//显示网格线。。
string[] str1 = new string[3];
foreach (DataRow row in dataset.Tables[0].Rows)
{
str1[0] = row["Interface"].ToString();
str1[1] = row["sucnum"].ToString();
str1[2] = row["failnum"].ToString();
ListViewItem item = new ListViewItem(str1, 0);
listView2.Items.Add(item);
}

}

zzyhuian06142 2008-07-17
  • 打赏
  • 举报
回复
你的ListView是在主线程中创建的
所以你必须在你的新线程中重新创建个ListView设置他的Location和Size
private void btnStart_Click(object sender, EventArgs e)
{
Thread threadTwo = new Thread(new ThreadStart(MsgTwo));
threadTwo.Start();

}
public void MsgTwo()
{
ListViewBind();
}

private void ListViewBind()
{
Thread.Sleep(1000);
ListView listView2 = new ListView();
listView2.location=你想要的位置;
listview2.size =你想要的大小;
listView2.Items.Clear();
listView2.Columns.Clear();
SqlConnection con = new SqlConnection("server=.;database=pubs;user id=sa;password=123");
con.Open();
DataSet dst = new DataSet();
SqlCommand cmd = new SqlCommand("select title_id,type from titles", con);
SqlDataAdapter dap = new SqlDataAdapter(cmd);
dap.Fill(dst);
/con.Close();

this.listView2.Columns.Add("调用接口", 80, HorizontalAlignment.Center);
this.listView2.Columns.Add("成功数", 80, HorizontalAlignment.Center);//增加列标题
this.listView2.Columns.Add("失败数",80,HorizontalAlignment.Center);

listView2.View = View.Details;
listView2.GridLines = true;//显示网格线。。
string[] str1 = new string[3];
foreach (DataRow row in dataset.Tables[0].Rows)
{
str1[0] = row["Interface"].ToString();
str1[1] = row["sucnum"].ToString();
str1[2] = row["failnum"].ToString();
ListViewItem item = new ListViewItem(str1, 0);
listView2.Items.Add(item);
}
}

110,825

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧