await
与 Task.Result
对比:最佳实践
《C# 并发手册》演示了处理已完成任务的模式:
<code class="language-csharp">var completedTask = await Task.WhenAny(downloadTask, timeoutTask); if (completedTask == timeoutTask) return null; return await downloadTask;</code>
此代码使用 Task.WhenAny
来确定 downloadTask
(httpclient.GetStringAsync
调用)是否在 timeoutTask
(Task.Delay
操作)之前完成。
为什么使用 await downloadTask
而不是简单地返回 downloadTask.Result
? 原因很关键:
异常处理:
await
避免了 AggregateException
的复杂性。 Task.Result
或 Task.Wait()
将异常包裹在 AggregateException
中,掩盖了根本原因。 理想情况下,异步代码应该直接处理异常,从而使 await
成为更干净的解决方案。避免死锁:
Task.Result
或 Task.Wait()
可能会导致死锁。 await
专为异步上下文而设计,可防止这种常见陷阱。最佳实践摘要:
await
,以实现更好的异常处理和死锁预防。Task.Result
或 Task.Wait()
在实用程序代码中可能是可以接受的(有明确的注释解释其基本原理),但通常最好避免使用。Task.Result
和 Task.Wait()
可以考虑用于同步阻塞是可以接受和理解的并行任务场景。以上是对于已完成的任务,什么时候应该使用'await”而不是'Task.Result”?的详细内容。更多信息请关注PHP中文网其他相关文章!