将消息发送到Windows GUI线程

我注意到,当你创build一个Web服务对象(从SoapHttpClientProtocolinheritance),并使用Async方法时,它会在Windows GUI线程上进行callback。

  1. 有谁知道这是如何工作的?
  2. 我怎样才能达到同样的目的。

我认为这将节省我不必检查我的GUIforms的InvokeRequired,如果我确定callback总是发生在GUI线程。

我怀疑它使用AsyncOperationmanager.SynchronizationContext静态获取同步上下文。 这可以让你适当地发布回调。

辉煌。 感谢您的答案。 两种选择似乎都起作用,并有其优势。

以下是我用来测试的示例代码:

public partial class AsyncTest : Form { static void Main() { Application.Run(new AsyncTest()); } AsyncOperation _operation; SynchronizationContext _context; TextBox _textBox; public AsyncTest() { _operation = AsyncOperationManager.CreateOperation(null); _context = WindowsFormsSynchronizationContext.Current; _textBox = new TextBox(); this.Controls.Add(_textBox); new Thread(AsyncThread).Start(); } void AsyncThread() { _operation.Post(GuiThread, null); _context.Post(GuiThread, null); } void GuiThread(object state) { _textBox.Text = _textBox.InvokeRequired ? "Didn't work" : "It Worked"; } } 

您可以在主线程中创建一个WindowsFormsSynchronizationContext对象,然后在另一个线程上调用其Send方法。