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
?
答案在于异常处理和潜在死锁的细微差别。await
与Result
或Wait
处理异常的方式不同。await
避免将异常包装在AggregateException
中,这在异步代码中通常是不希望看到的。此外,Result
和Wait
可能会导致死锁,尤其是在异步方法中。
因此,建议优先使用await
,除非可以明确确定任务已完成。一般来说,应避免在异步应用程序代码中使用Result
和Wait
。它们偶尔可以在异步实用程序库或并行任务代码中使用。
遵循这些准则,开发者可以提高异步代码库的安全性和可维护性,并提升代码可读性。
以上是C# 中的 Await 与 Result:什么时候应该使用 Await 而不是访问 Task.Result?的详细内容。更多信息请关注PHP中文网其他相关文章!