C#异步编程中await Task.Run()
与return Task.Run()
的关键区别
在异步编程中,经常需要在UI线程之外执行操作以避免应用程序冻结。这可以通过C#中的任务来实现。然而,在处理异常和其他方面时,await Task.Run()
和return Task.Run()
之间存在细微的差别。
1. 异常传播:
主要区别在于异常传播。在await Task.Run()
情况下:
相反,在return Task.Run()
情况下:
2. 对同步上下文的依赖:
另一个区别是await Task.Run()
版本依赖于调用线程的同步上下文。当任务完成时,延续会在相同的同步上下文中执行。这确保了UI更新(例如启用禁用的按钮)发生在正确的线程上。
相反,return Task.Run()
版本不依赖于同步上下文。延续安排在默认任务调度程序上,这可能与调用线程的同步上下文不同。
3. 生成的代码:
两种方法生成的代码略有不同。在await Task.Run()
情况下,会创建一个async/await状态机来管理异步执行。这导致比return Task.Run()
更复杂的代码。
代码示例:
以下代码示例说明了这些差异:
示例1:
<code class="language-csharp">async Task TestAsync() { await Task.Run(() => DoSomeWork()); // 异常在等待时传播回 }</code>
示例2:
<code class="language-csharp">Task TestAsync() { return Task.Run(() => DoSomeWork()); // 异常立即抛出 }</code>
在这两个示例中,“DoSomeWork()”是一个在UI线程之外执行某些工作的方法。
结论:
await Task.Run()
和return Task.Run()
的选择取决于应用程序的具体需求。当控制异常传播和确保正确的同步上下文处理至关重要时,推荐使用await Task.Run()
。当需要立即传播异常或同步上下文处理不是问题时,return Task.Run()
是合适的。
以上是等待Task.run()vs. return task.run():C#异步编程的关键差异是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!