首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用基于事件的异步模式的基于UI的应用程序

使用基于事件的异步模式的基于UI的应用程序
EN

Stack Overflow用户
提问于 2015-04-10 15:14:24
回答 1查看 77关注 0票数 0

我根据Microsoft基于事件的异步模式实现了一个组件,以与REST服务交互,我希望在基于UI的应用程序中使用该组件。

我会把代码发出去,但是有很多。

总之,我观察到的是:

  1. 我启动了运行在ThreadID 1上的应用程序,因此UI属于ThreadID 1
  2. 我向组件注册了一个方法,当taskCompleted事件触发(仍运行在ThreadID 1上)时,该组件更新UI。
  3. 我调用runTaskAsync方法,该方法使用本文中描述的AsyncOperation创建AsyncOperationManager,并调用其BeginInvoke方法。
  4. 调用BeginInvoke后,执行从ThreadID 1切换到ThreadID 5(或任意),并输入工作方法。
  5. 在ThreadID 5完成工作后,将调用AsyncOperation.PostOperationCompleted方法,并将其执行到另一个ThreadID 7(或任何),而不是返回到ThreadID 1。

问题是UI更新方法由不拥有UI的第三个线程(ID 7)执行。

在我的解决方案中,我检查this.InvokeRequired属性:

代码语言:javascript
复制
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,那就太好了。

感谢您的阅读。

EN

回答 1

Stack Overflow用户

发布于 2015-04-10 15:31:21

在封面下面,AsyncOperation.PostOperationCompleted()调用Post,它最终会这样做(根据Reflector,使用.NET 4.5):

代码语言:javascript
复制
ThreadPool.QueueUserWorkItem(new WaitCallback(d.Invoke), state);

其中d是您的回调委托。

因此,您的委托正在线程池中的线程上运行。

你看到的都是正常的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29564969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档