首页 >后端开发 >C++ >对于已完成的任务,什么时候应该使用'await”而不是'Task.Result”?

对于已完成的任务,什么时候应该使用'await”而不是'Task.Result”?

Susan Sarandon
Susan Sarandon原创
2025-01-22 23:19:11198浏览

When Should You Use `await` Instead of `Task.Result` for Completed Tasks?

已完成任务的

awaitTask.Result 对比:最佳实践

《C# 并发手册》演示了处理已完成任务的模式:

<code class="language-csharp">var completedTask = await Task.WhenAny(downloadTask, timeoutTask);
if (completedTask == timeoutTask)
  return null;
return await downloadTask;</code>

此代码使用 Task.WhenAny 来确定 downloadTaskhttpclient.GetStringAsync 调用)是否在 timeoutTaskTask.Delay 操作)之前完成。

为什么使用 await downloadTask 而不是简单地返回 downloadTask.Result? 原因很关键:

异常处理:

  • await 避免了 AggregateException 的复杂性。 Task.ResultTask.Wait() 将异常包裹在 AggregateException 中,掩盖了根本原因。 理想情况下,异步代码应该直接处理异常,从而使 await 成为更干净的解决方案。

避免死锁:

  • 在异步方法中使用 Task.ResultTask.Wait() 可能会导致死锁。 await 专为异步上下文而设计,可防止这种常见陷阱。

最佳实践摘要:

  • 在异步应用程序代码中优先使用await,以实现更好的异常处理和死锁预防。
  • 虽然 Task.ResultTask.Wait() 在实用程序代码中可能是可以接受的(有明确的注释解释其基本原理),但通常最好避免使用。
  • Task.ResultTask.Wait() 可以考虑用于同步阻塞是可以接受和理解的并行任务场景。

以上是对于已完成的任务,什么时候应该使用'await”而不是'Task.Result”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn