.net 向Windows GUI线程发送消息
我注意到,当您创建一个web服务对象(继承自SoapHttpClientProtocol)并使用Async方法时,它会在Windows GUI线程上进行回调.net 向Windows GUI线程发送消息,.net,windows,user-interface,asynchronous,message-pump,.net,Windows,User Interface,Asynchronous,Message Pump,我注意到,当您创建一个web服务对象(继承自SoapHttpClientProtocol)并使用Async方法时,它会在Windows GUI线程上进行回调 有人知道这是怎么回事吗 我怎样才能实现同样的目标 我想,如果我确信回调总是发生在GUI线程上,那么这将避免我必须检查GUI表单中所需的invoker。我怀疑它用于静态获取同步上下文。然后,这允许您适当地发布回调。您可以在主线程中创建WindowsFormsSynchronizationContext对象,然后在其他线程上调用其发送方法。。谢
我想,如果我确信回调总是发生在GUI线程上,那么这将避免我必须检查GUI表单中所需的invoker。我怀疑它用于静态获取同步上下文。然后,这允许您适当地发布回调。您可以在主线程中创建WindowsFormsSynchronizationContext对象,然后在其他线程上调用其发送方法。。谢谢你的回答。这两种选择似乎都有效,而且都有各自的优势 下面是我用来测试的示例代码:
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";
}
}