C#报”WrongThreadException”的原因以及解决办法

  • Post category:C#

.NET报错“WrongThreadException”通常是因为在多线程程序中,将某个线程中的对象或控件在另一个线程中使用,会导致线程跨域访问,从而触发该异常。

这种情况可以通过使用Invoke方法或BeginInvoke方法来在UI线程上执行必要的代码。Invoke方法在窗体线程上同步执行要调用的方法,而BeginInvoke方法则异步地在窗体线程上执行要调用的方法。

以下是两个示例说明如何使用Invoke和BeginInvoke来解决WrongThreadException:

  1. 示例一:在多线程程序中访问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();
}
  1. 示例二:使用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;
    }));
}