c# - 在主线程上执行异步任务的最佳方式

标签 c# .net wpf asynchronous async-await

我想知道在 .NET 应用程序(准确地说是在 ViewModel 中)的主线程上执行任务的最佳异步方式是什么。 Dispatcher.BeginInvoke 现在是否仍然有效,或者是否存在更好的方法?

最佳答案

BeginInvoke非常低级;总有更好的方法可用。

在大多数情况下,您可以使用 async/await从 UI 线程启动异步操作,并自动返回到 UI 线程以显示结果。默认情况下,UI 上下文由 await 捕获并用于恢复 async等待操作完成后的方法。 (我对此进行了更详细的描述 on my blog )。

如果您需要从您的 UI 显示进度报告,最好的选择是 IProgress<T>/Progress<T>类型,它再次为您进行所有线程编码。

最后,如果您确实需要使用无休止的数据序列更新 UI,最好的选择是使用 Reactive Extensions 并观察捕获的 SynchronizationContext .

这些选项从最常见到最不常见。我估计 90% 的用例只包含 async/await , 99% 覆盖 async/await + IProgress<T> , 并且 100% 被 Rx 覆盖。我从来没有遇到过 BeginInvoke 的情况有必要的。甚至是有益的。

关于c# - 在主线程上执行异步任务的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30040830/

相关文章:

c# - 如何使用 C# 打开文件(安装程序)

c# - WCF 服务 - 哪些部分可以从源代码管理中排除?

.net - 在 web api 中使用 odata 函数 isof

C# WPF 绑定(bind)不从 Property 获取数据

c# - 在wpf中单击图像外部时隐藏图像

wpf - 如何像代理一样使用Binding?

c# - LuaInterface - 在 .Net 3.5/.Net 4.0 下编译 FileLoadException

c# - 制作 C++/MFC 应用程序以从其他应用程序中提取 AssemblyInfo?

c# - 字符串表列表 c#

c# - 存储对象的 XML/CSV/其他表示的最佳位置是什么