提问人:Richard Nienaber 提问时间:10/21/2008 最后编辑:Patrik SvenssonRichard Nienaber 更新时间:11/15/2008 访问量:1205
向 Windows GUI 线程发送消息
Sending a message to the Windows GUI Thread
问:
我注意到,当您创建一个 Web 服务对象(继承自 SoapHttpClientProtocol)并使用 Async 方法时,它会在 Windows GUI 线程上进行回调。
- 有谁知道这是怎么回事?
- 我怎样才能实现同样的事情。
我认为,如果我确定回调始终发生在 gui 线程上,这将节省我在 GUI 表单中检查 InvokeRequired 的麻烦。
答:
4赞
Jon Skeet
10/21/2008
#1
我怀疑它使用 AsyncOperationmanager.SynchronizationContext 静态获取同步上下文。然后,这允许您适当地发布回调。
1赞
Stefan Schultze
10/21/2008
#2
可以在主线程中创建一个 WindowsFormsSynchronizationContext 对象,然后在其他线程上调用其 Send 方法。
2赞
Richard Nienaber
10/21/2008
#3
明。感谢您的回答。这两种选择似乎都有效并且各有优势。
下面是我用来测试的示例代码:
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";
}
}
评论