如何从线程内部更新列表框
本文关键字:更新 列表 内部 线程 | 更新日期: 2023-09-27 18:29:52
我的代码中出现错误:
跨线程操作无效:控件"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();
在DOT-NET中,不能从用户创建的线程中修改UI元素。只允许主线程(创建控件的线程)修改它。这意味着,在新线程中不能更新列表框条目。
还有其他类似CCD_ 1的策略。请查看@Rotem发布的链接,并在谷歌上搜索BackgroundWorker。
更新:如果你按照链接并决定采用ListBox1.Invoke()
的方式,那么我建议使用BeginInvoke
代替Invoke
。
围绕这一点进行列表框更新。
this.Invoke(new MethodInvoker(delegate()
{
//stuff
}));