我的代码出错:
跨线程操作无效:控制'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();
答案 0 :(得分:0)
在DOT-NET中,您无法修改用户创建的线程中的UI元素。只允许主线程(创建控件)修改它。这意味着,在新线程中,您无法更新列表框条目。
还有其他策略,例如BackgroundWorker
。请注意@Rotem发布的链接以及后面的BackgroundWorker。
更新:如果您点击该链接并决定采用ListBox1.Invoke()
方式,那么我建议您使用BeginInvoke
代替Invoke
。
答案 1 :(得分:0)
将列表框更新为此。
this.Invoke(new MethodInvoker(delegate()
{
//stuff
}));