首页 >后端开发 >C++ >C# 中的 Await 与 Result:什么时候应该使用 Await 而不是访问 Task.Result?

C# 中的 Await 与 Result:什么时候应该使用 Await 而不是访问 Task.Result?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-22 23:03:11759浏览

Await vs. Result in C#: When Should You Use Await Instead of Accessing Task.Result?

C#异步编程中Await与Result的比较

在C#异步编程中,await关键字用于挂起执行,直到任务完成。然而,一些开发者会质疑,如果任务已完成,为什么还需要await,直接访问Task.Result属性不行吗?本文将探讨这个问题,并解释为什么应该优先使用await

Stephen Cleary在其著作《Concurrency in C# Cookbook》中建议使用以下代码片段:

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

这里,downloadTask代表一个HTTP GET请求,timeoutTask作为超时监控。如果HTTP请求在给定时间内未完成,则timeoutTask完成。

假设HTTP请求在超时前完成。在这种情况下,downloadTask已经完成。那么,为什么代码片段还要使用第二个await?为什么不直接使用downloadTask.Result

答案在于异常处理和潜在死锁的细微差别。awaitResultWait处理异常的方式不同。await避免将异常包装在AggregateException中,这在异步代码中通常是不希望看到的。此外,ResultWait可能会导致死锁,尤其是在异步方法中。

因此,建议优先使用await,除非可以明确确定任务已完成。一般来说,应避免在异步应用程序代码中使用ResultWait。它们偶尔可以在异步实用程序库或并行任务代码中使用。

遵循这些准则,开发者可以提高异步代码库的安全性和可维护性,并提升代码可读性。

以上是C# 中的 Await 与 Result:什么时候应该使用 Await 而不是访问 Task.Result?的详细内容。更多信息请关注PHP中文网其他相关文章!

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