如何在C#中从工作线程发布UI消息

时间:2011-03-15 18:28:24

标签: c# windows winforms multithreading message

我正在用C#编写一个简单的winforms应用程序。我创建了一个工作线程,我希望主窗口响应完成其工作的步骤 - 只需更改文本字段中的一些文本,testField.Text =“Ready”。我尝试了事件和回调,但它们都在调用线程的上下文中执行,你不能从工作线程做UI。

我知道如何在C / C ++中完成它:从工作线程调用PostMessage。我假设我可以从C#调用Windows API,但是不存在更具特定于.NET的解决方案吗?

5 个答案:

答案 0 :(得分:2)

在完成的线程回调事件中,使用InvokeRequired模式,如此SO帖子的各种答案所示。

C#: Automating the InvokeRequired code pattern

另一种选择是使用BackgroundWorker组件来运行你的线程。 RunWorkerCompleted事件处理程序在启动worker的线程的上下文中执行。

答案 1 :(得分:1)

我通常做这样的事情

void eh(Object sender,
EventArgs e)
{
   if (this.InvokeRequired)
   {
      this.Invoke(new EventHandler(this.eh, new object[] { sender,e });
       return;
    }  
    //do normal updates
}

答案 2 :(得分:0)

Control.Invoke()或Form.Invoke()方法执行您在UI线程上提供的委托。

答案 3 :(得分:0)

您可以使用表单的Invoke功能。该函数将在UI线程上运行。

EX:

...
MethodInvoker meth = new MethodInvoker(FunctionA);
form.Invoke(meth);
....

void FunctionA()
{
   testField.Text = "Ready". 
}

答案 4 :(得分:0)