我有简单的应用程序。我有一个arraylist,这个列表包括网站。
单击按钮时出错。错误是;
System.Windows.Forms.dll中出现'System.InvalidOperationException'类型的第一次机会异常
附加信息:跨线程操作无效:控制'listBox2'从其创建的线程以外的线程访问。
如果存在此异常的处理程序,则可以安全地继续该程序。
代码如下:
private void button2_Click(object sender, EventArgs e) {
for (int i = 0; i < sitelist.Count; i++) {
Thread thread = new Thread(getStatus);
thread.Start((string)sitelist[i]);
}
}
private void getStatus(Object obj) {
listBox2.Items.Add("1");
}
当我编写代码时:
private void getStatus(Object obj) {
MessageBox.Show((string)obj);
}
它有效。我使用listbox时为什么会显示错误?
此致。 OMER。
答案 0 :(得分:2)
您必须使用BeginInvoke
private void getStatus(Object obj) {
this.BeginInvoke(new EventHandler((s,e)=>{listBox2.Items.Add("1")}));
}
原因是您不能触摸属性或影响WinForm控件的绘制从任何其他线程而不是主线程。你必须将一个回调编组回主线程,而Invoke / BeginInvoke将为你做这个。