将数据异步发送回UI线程

本文关键字:UI 线程 数据 异步 | 更新日期: 2023-09-27 18:22:46

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

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

我可以从WF4异步返回url/页面数据并在UI上捕获的任何指南。

将数据异步发送回UI线程

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

我认为,最简单的方法是使用BackgroundWorker类(使用示例)。

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

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

*-我所说的最简单是指最容易开始!例如,async/await更适合于需要执行许多不同异步操作的应用程序,但同样,在掌握多线程技术之前,这些操作并不那么容易。

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

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