跨线程访问控件的问题
当我们在一个线程中想访问主线程创建的控件时可以使用以下代码
Control.CheckForIllegalCrossThreadCalls = false;
但是这是不推荐的,不安全的,在实际的开发中不要使用这种方式;
解决这个问题,可以采用下面的方式:
首先先看一个小案例
点击按钮时将当前的时间赋值给label控件
以下是点击事件的代码
private void btnStartThread_Click(object sender, EventArgs e)
{
Thread thread = new Thread(() =>
{
//如果是别的线程创建的此控件则返回true
if (label1.InvokeRequired)
{
Action<string> action = (s) => { this.label1.Text=s;};
//让创建该控件的线程去操作; invoke 第一个参数是委托,第二个参数是 传入委托的参数;
label1.Invoke(action,DateTime.Now.ToString());
}
else
{
label1.Text = DateTime.Now.ToString();
}
});
thread.IsBackground = true;
thread.Start();
}
这段代码的核心就是label1.InvokeRequired
label1.Invoke
通过这种方式就能解决跨线程访问控件的问题了