目前,我正在做一个项目,涉及到Window Foundation 4的页面导航控件。我可以通过阻塞UI线程,直到WF线程返回url来实现这一点。
但这也是不实际的,如果我的WF内容有很长的处理时间,那么UI线程将被停止一段时间,用户没有意识到这一点。
我可以从WF4异步返回我的url/页面数据并在UI上捕获的任何指南。
发布于 2013-07-16 13:42:51
有许多选择,但都围绕着创建一个多线程应用程序。
我认为最简单的*方法是使用BackgroundWorker类(usage example)。
其他选项包括使用.NET 4.5中提供的async和await关键字(如果您使用此版本的dotNET)。如果您使用的是旧版本,并且不想使用BackgroundWorker,则可以使用Task类来创建后台任务。更原始的方法包括使用和管理Thread实例(如果Task类不可用)。既然您正在使用WF4,那么一些新的技术应该可以很好地工作。;)
需要注意的一件事是,大多数人从多线程开始就忘记了这一点--你不能从另一个线程访问属于UI线程(应用程序的主线程)的资源!这就是为什么BackgroundWorker可能是一个很好的启动解决方案,因为它公开了两个事件(ProgressChanged和RunWorkerCompleted),允许您根据需要在UI上执行某些操作。
*-我的意思是最简单的开始!例如,async/await更适合于需要执行大量不同异步操作的应用程序,但在您掌握多线程的一般技巧之前,这些操作并不容易。
实际上,您并没有指定您的应用程序将执行多少异步操作,并且您提到了.NET 4.0的限制(因此没有async / await)。如果您需要执行许多不同的操作,我建议使用Task类。
只需花一点力气,您就可以使用任务创建一个工作的多线程应用程序,而不需要创建意大利面条式的代码,这可能是一场真正的噩梦。当您在服务中使用Begin-End异步方法时,这尤其有用-在这种情况下,Task.Factory.FromAsync真的很有帮助。事件驱动的异步服务也应该公开一个使用Begin-End的接口。
https://stackoverflow.com/questions/17668437
复制相似问题