📜  正在从错误的线程 c# 调用对此控件执行的操作(1)

📅  最后修改于: 2023-12-03 15:26:52.509000             🧑  作者: Mango

正在从错误的线程调用对此控件执行的操作

在C#编程中,我们有时会遇到“正在从错误的线程调用对此控件执行的操作”这个错误。这个错误通常发生在多线程编程中,当我们尝试从一个线程中访问另一个线程创建的控件时,就会出现这个错误。

问题描述

以下是一个简单的使用System.Windows.Forms.Timer实现计数器的程序:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        timer1.Interval = 1000;
        timer1.Tick += Timer1_Tick;
        timer1.Start();
    }

    private void Timer1_Tick(object sender, EventArgs e)
    {
        label1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
    }
}

这个程序没有运行任何多线程代码,但是,如果在程序运行时,在一个线程中调用以下代码:

label1.Text = "Hello World!";

就会出现“正在从错误的线程调用对此控件执行的操作”错误。为了避免这个错误,我们需要使用Invoke()方法在正确的线程中执行对控件的操作。

解决方法

我们可以通过以下方法将调用代码放入正确的线程中:

if (label1.InvokeRequired)
{
    label1.Invoke(new Action(() =>
    {
        label1.Text = "Hello World!";
    }));
}
else
{
    label1.Text = "Hello World!";
}

上述代码首先检查控件的InvokeRequired属性,如果它为true,则调用Invoke()方法,将调用传递给拥有控件的线程。如果InvokeRequired属性为false,则表示在正确的线程中,在此情况下可以直接更新控件。

参考资料
  1. 如何:在 Windows 窗体控件上使用多线程