从C#中的另一个线程调用函数

时间:2010-11-21 08:47:57

标签: c#

我有一个带有XYZ()功能的主GUI线程来做一些关于GUI的事情。 在其他线程中,如果我从主GUI的句柄调用XYZ(),则显示错误        “跨线程操作无效:控制'Button00'从其创建的线程以外的线程访问。”

我该如何解决这个问题?我想我需要向GUI线程发送消息来做XYZ功能。请帮帮我。

感谢。

Ankata

2 个答案:

答案 0 :(得分:7)

您收到此错误消息的原因是您尝试从不同于主要的线程更新GUI控件,这是不可能的。应始终在用于创建GUI控件的同一线程上修改GUI控件。

如果Invoke将编组主线程的调用,则可以使用InvokeRequired。这是一个nice article

但最简单的解决方案可能就是简单地使用BackgroundWorker,因为这样您就不再需要手动封送对GUI线程的调用。这是自动完成的:

var worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
    // call the XYZ function
    e.Result = XYZ();
};
worker.RunWorkerCompleted += (sender, e) =>
{
    // use the result of the XYZ function:
    var result = e.Result;
    // Here you can safely manipulate the GUI controls
};
worker.RunWorkerAsync();

答案 1 :(得分:3)

通常,C#中的GUI只能从创建它的同一个线程更新 如果它不是相同的线程,则InvokeRequired的值为true,否则为false, 如果确实如此,则再次调用相同的方法,但是从同一个线程创建GUI

你应该像这样使用它:

 delegate void valueDelegate(string value);

    private void SetValue(string value)
    {   
        if (someControl.InvokeRequired)
        {
            someControl.Invoke(new valueDelegate(SetValue),value);
        }
        else
        {
            someControl.Text = value;
        }
    }

试试这个以获取更多信息

How to update the GUI from another thread in C#?