我注意到,当你创build一个Web服务对象(从SoapHttpClientProtocolinheritance),并使用Async方法时,它会在Windows GUI线程上进行callback。
我认为这将节省我不必检查我的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方法。