在多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,如果需要访问窗口中的控件,可以在窗口构造函数中将CheckForIllegalCrossThreadCalls设置为 false。
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
也可以针对某一控件进行设置,例如:
listBox1.CheckForIllegalCrossThreadCalls = false;
另:
当然,设置CheckForIllegalCrossThreadCalls =false 是能去掉这个检查的,但是这不是标准的作法.
标准的作法是在访问界面控件时,访问下窗体的 InvokeRequired 属性,如果为false就可以直接访问,否则就是跨线程访问;此时,创建一个delegate,并通过Invoke() 来调用它.
private void button1_Click(object sender, EventArgs e)
{
//线程的依附性:只有创建某些对象的线程、才能访问它所创建的某些对象
//解决跨线程调用的问题,可以采用封送(Marshal) .调用Invoke方法
//使用封送
new Thread(() =>
{
for (int i = 0; i < 10000; i++)
{
Action<int> action = (data) =>
{
this.label1.Text = data.ToString(); };
Invoke(action,i);
}
}).Start();
//MessageBox 没有遵循依附性的原则,所以可以在工作线程中直接访问
}