await Task.Run
:有必要吗?在异步方法中使用 await Task.Run
通常会引起混乱。 让我们用一个例子来澄清这一点:
<code class="language-csharp">await Task.Run(() => LongProcess());</code>
相比:
<code class="language-csharp">await LongProcess();</code>
其中 LongProcess
是包含多个异步调用的异步方法(例如 DbDataReader.ExecuteReaderAsync()
)。
主要区别:
在这种情况下,await Task.Run
是多余的。 它在已经异步的方法中引入了不必要的额外任务。异步方法已经通过线程池利用并发性。 添加 Task.Run
会产生不必要的开销。
说明:
Async/await 有助于非阻塞代码执行。 该线程在等待异步操作完成的同时继续处理其他任务。 当调用异步方法时,线程不会被阻塞; await
关键字允许线程在操作完成后恢复执行。
重要注意事项:
await
处暂停,并在等待的任务完成时恢复。 虽然上下文切换可能涉及不同的线程,但逻辑流很大程度上仍然是单线程的。Task.Run
有益。 将计算卸载到后台线程可以防止阻塞主 UI 线程,从而确保响应能力。结论:
对于所呈现的场景,直接使用await LongProcess()
是最佳且更有效的方法。 异步方法本质上处理并发;添加 Task.Run
没有任何好处并增加了复杂性。
以上是什么时候应该在异步方法中使用'await Task.Run”?的详细内容。更多信息请关注PHP中文网其他相关文章!