目前我正在做一个涉及Window Workflow Foundation 4页面导航控件的项目。我可以通过阻止UI线程来实现这一点,直到WF线程返回url。
但这也不是很实际,如果我的WF内容处理时间很长,那么UI线程将停止一段时间,用户也没有意识到这一点。
我可以从WF4异步返回我的网址/页面数据并捕获用户界面的任何指南。
答案 0 :(得分:0)
有许多选项,但都围绕创建多线程应用程序。
我认为最简单的方法是使用BackgroundWorker
类(usage example)。
其他选项包括使用.NET 4.5中提供的async
和await
关键字(如果您使用的是此版本的dotNET)。如果您使用的是旧版本并且不想使用BackgroundWorker
,则可以使用Task
类创建后台任务。更原始的方法涉及使用和管理Thread
实例(如果Task
类不可用)。看到你正在使用WF 4,一些较新的技术应该可以正常工作。 ;)
有一点需要注意,大多数人开始使用多线程忘记了(在那里,完成了) - 你无法从另一个线程访问属于UI线程的资源(你的应用程序的主线程)!这就是BackgroundWorker
可能是一个很好的启动解决方案的原因,因为它公开了2个事件(ProgressChanged
和RunWorkerCompleted
),允许您根据需要在UI上执行操作。
* - 最简单,我的意思是最容易开始!例如,async
/ await
更适合需要执行大量不同异步操作的应用程序,但是在您获得多线程挂起之前,这些都不是那么容易。总的来说。
实际上,您没有指定应用程序执行的异步操作数量,并且您提到受.NET 4.0的限制(因此没有async
/ await
)。如果您需要执行许多不同的操作,我建议您使用Task
类。
通过一些努力,您可以使用任务来创建工作的多线程应用程序,而无需创建意大利面条代码,这可能是一个真正的噩梦。当您在服务中使用Begin-End
异步方法时,这一点尤其有用 - Task.Factory.FromAsync
在这种情况下可能非常有用。事件驱动的异步服务还应该公开使用Begin-End
的接口。