如何从线程内更新列表框?

时间:2013-09-01 14:47:11

标签: c# multithreading

我的代码出错:

  

跨线程操作无效:控制'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();

2 个答案:

答案 0 :(得分:0)

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

还有其他策略,例如BackgroundWorker。请注意@Rotem发布的链接以及后面的BackgroundWorker。

更新:如果您点击该链接并决定采用ListBox1.Invoke()方式,那么我建议您使用BeginInvoke代替Invoke

答案 1 :(得分:0)

将列表框更新为此。

this.Invoke(new MethodInvoker(delegate()
{
 //stuff
}));