首页 >后端开发 >C++ >Await 与 Result:何时应该在 C# 异步任务中使用 `await` 而不是 `.Result`?

Await 与 Result:何时应该在 C# 异步任务中使用 `await` 而不是 `.Result`?

DDD
DDD原创
2025-01-22 22:51:09801浏览

Await vs. Result: When Should You Use `await` Instead of `.Result` in C# Async Tasks?

C#异步任务中await.Result的选择

在Stephen Cleary的《C#并发编程手册》中,一种技巧引起了我的注意:

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

既然downloadTask如果没有超时就已经完成了,为什么还要进行第二次await而不是直接返回downloadTask.Result呢?

await优于.Result的优势

作者强调了优先使用await而不是.Result(或Wait)的两个主要原因:

  1. 异常处理: await不会将异常包装在AggregateException中,从而提供更清晰的异常处理机制。
  2. 避免死锁: 在异步方法中使用.ResultWait可能导致死锁或细微的运行时问题。

使用指南

虽然并非完全禁止使用.ResultWait,但建议遵循以下指南:

  • 异步应用程序代码: 始终使用await
  • 异步实用程序库: 可以谨慎地使用.ResultWait,并提供充分的文档说明。
  • 并行任务代码: 对于非异步的并行任务,.ResultWait是合适的。

遵循这些指南,开发者可以改进异常处理,防止死锁,并编写更健壮、更易维护的异步代码。

以上是Await 与 Result:何时应该在 C# 异步任务中使用 `await` 而不是 `.Result`?的详细内容。更多信息请关注PHP中文网其他相关文章!

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