异步将数据发送回UI线程

时间:2013-07-16 05:08:50

标签: c# asp.net workflow-foundation-4

目前我正在做一个涉及Window Workflow Foundation 4页面导航控件的项目。我可以通过阻止UI线程来实现这一点,直到WF线程返回url。

但这也不是很实际,如果我的WF内容处理时间很长,那么UI线程将停止一段时间,用户也没有意识到这一点。

我可以从WF4异步返回我的网址/页面数据并捕获用户界面的任何指南。

1 个答案:

答案 0 :(得分:0)

有许多选项,但都围绕创建多线程应用程序。

我认为最简单的方法是使用BackgroundWorker类(usage example)。

其他选项包括使用.NET 4.5中提供的asyncawait关键字(如果您使用的是此版本的dotNET)。如果您使用的是旧版本并且不想使用BackgroundWorker,则可以使用Task类创建后台任务。更原始的方法涉及使用和管理Thread实例(如果Task类不可用)。看到你正在使用WF 4,一些较新的技术应该可以正常工作。 ;)

有一点需要注意,大多数人开始使用多线程忘记了(在那里,完成了) - 你无法从另一个线程访问属于UI线程的资源(你的应用程序的主线程)!这就是BackgroundWorker可能是一个很好的启动解决方案的原因,因为它公开了2个事件(ProgressChangedRunWorkerCompleted),允许您根据需要在UI上执行操作。

* - 最简单,我的意思是最容易开始!例如,async / await更适合需要执行大量不同异步操作的应用程序,但是在您获得多线程挂起之前,这些都不是那么容易。总的来说。

实际上,您没有指定应用程序执行的异步操作数量,并且您提到受.NET 4.0的限制(因此没有async / await)。如果您需要执行许多不同的操作,我建议您使用Task类。

通过一些努力,您可以使用任务来创建工作的多线程应用程序,而无需创建意大利面条代码,这可能是一个真正的噩梦。当您在服务中使用Begin-End异步方法时,这一点尤其有用 - Task.Factory.FromAsync在这种情况下可能非常有用。事件驱动的异步服务还应该公开使用Begin-End的接口。