我已根据Microsoft的基于事件的异步模式实现了一个组件,以便与我想在基于UI的应用程序中使用的REST服务进行交互。
我会发布代码,但有很多。
无论如何,我简要观察的是:
问题是UI更新方法是由不拥有UI的第三个线程(ID 7)执行的。
在我的解决方法中,我检查了this.InvokeRequired属性:
private void task_completed(EventArgs e)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new Action<EventArgs>(login_completed), new[] { e });
}
else
{
//Execute UI stuff
}
}
它工作正常,但我想知道我是否犯了错误,或者这种行为是否正常。
我希望AsyncOperation.PostOperationCompleted方法直接调用ThreadID 1。相反,它创建了另一个必须调用线程1 ...
的线程如果它直接调用线程1会很好。
感谢阅读。
答案 0 :(得分:0)
在幕后,AsyncOperation.PostOperationCompleted()调用Post,最终执行此操作(根据Reflector,使用.NET 4.5):
ThreadPool.QueueUserWorkItem(new WaitCallback(d.Invoke), state);
其中d是你的回调代表。
所以你的委托正在线程池的一个线程上运行。
你所看到的是正常的。