0

我的代码中出现错误:

跨线程操作无效:控件“listBox1”从创建它的线程以外的线程访问

代码:

 private void button2_Click(object sender, EventArgs e)
 {
     Thread t1 = new Thread(mult);
     t1.Start();
 }
 public void mult()
 {
     FileStream fq = new FileStream(textBox1.Text, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite);
     StreamReader s = new StreamReader(fq);
     while (!s.EndOfStream)
     {
         Thread.Sleep(500);
         listBox1.Items.Add(s.ReadLine()); //error at this line

     }

     s.Close();
4

2 回答 2

0

在 DOT-NET 中,您不能从用户创建的线程修改 UI 元素。仅允许主线程(创建控件)对其进行修改。这意味着,您无法从新线程中更新列表框条目。

还有其他策略,例如BackgroundWorker. 请查看@Rotem 发布的链接,也可以通过 Google 搜索 BackgroundWorker。

更新:如果您点击链接并决定走这ListBox1.Invoke()条路,那么我建议您使用BeginInvoke.Invoke

于 2013-09-01T14:54:18.070 回答
0

将列表框更新围绕此。

this.Invoke(new MethodInvoker(delegate()
{
 //stuff
}));
于 2013-09-01T14:56:37.253 回答