.NET报错“WrongThreadException”通常是因为在多线程程序中,将某个线程中的对象或控件在另一个线程中使用,会导致线程跨域访问,从而触发该异常。
这种情况可以通过使用Invoke方法或BeginInvoke方法来在UI线程上执行必要的代码。Invoke方法在窗体线程上同步执行要调用的方法,而BeginInvoke方法则异步地在窗体线程上执行要调用的方法。
以下是两个示例说明如何使用Invoke和BeginInvoke来解决WrongThreadException:
- 示例一:在多线程程序中访问UI控件导致的WrongThreadException
在下面的代码中,当使用另一个线程更改了UI控件的背景色时,将会触发WrongThreadException。
private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(() =>
{
this.BackColor = Color.Red; // 跨线程访问UI控件
});
t.Start();
}
为了解决这个问题,我们可以使用Invoke或BeginInvoke方法在UI线程上执行对UI的控制访问操作,如下所示:
private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(() =>
{
// 使用Invoke方法访问UI控件
this.Invoke((Action)(() =>
{
this.BackColor = Color.Red;
}));
});
t.Start();
}
- 示例二:使用Timer触发事件时出现WrongThreadException
在下面的代码中,当使用Timer控件的Tick事件更改UI控件的背景色时,将会触发WrongThreadException:
private void timer1_Tick(object sender, EventArgs e)
{
this.BackColor = Color.Blue; // 跨线程访问UI控件
}
为了解决这个问题,可以使用BeginInvoke方法在UI线程上异步执行对UI控制访问操作,如下所示:
private void timer1_Tick(object sender, EventArgs e)
{
// 使用BeginInvoke方法异步访问UI控件
this.BeginInvoke((Action)(() =>
{
this.BackColor = Color.Blue;
}));
}