我注意到,当您创建一个 Web 服务对象(从 SoapHttpClientProtocol 继承)并使用 Async 方法时,它会在 Windows GUI 线程上进行回调。
- 有谁知道这是如何工作的?
 - 我怎样才能达到同样的目的。
 
如果我确定回调总是在 gui 线程上发生,我认为这将使我不必在我的 GUI 表单中检查 InvokeRequired。
我注意到,当您创建一个 Web 服务对象(从 SoapHttpClientProtocol 继承)并使用 Async 方法时,它会在 Windows GUI 线程上进行回调。
如果我确定回调总是在 gui 线程上发生,我认为这将使我不必在我的 GUI 表单中检查 InvokeRequired。
我怀疑它使用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 方法。