2013-07-16 107 views
2

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

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

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

+0

你尝试过异步处理程序吗? –

+0

不,PKKG。不幸的是,我只使用vs2010和.Net 4。我正在研究Shaamaan的建议。随时接收任何进一步的建议 – JohnZai

回答

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的接口。