gpt4 book ai didi

c# - 等待与 task.Result 相同的已完成任务?

转载 作者:IT王子 更新时间:2023-10-29 03:35:36 26 4
gpt4 key购买 nike

我目前正在阅读 Stephen Cleary 撰写的“C# Cookbook 中的并发性”,我注意到以下技术:

var completedTask = await Task.WhenAny(downloadTask, timeoutTask);  
if (completedTask == timeoutTask)
return null;
return await downloadTask;

downloadTask 是对 httpclient.GetStringAsync 的调用,timeoutTask 正在执行 Task.Delay

如果没有超时,则 downloadTask 已经完成。鉴于任务已经完成,为什么有必要进行第二次等待而不是返回 downloadTask.Result

最佳答案

这里已经有一些很好的答案/评论,但只是插话......

我更喜欢 await 而不是 Result(或 Wait)的原因有两个。首先是错误处理不同; await 不会将异常包装在 AggregateException 中。理想情况下,异步代码根本不需要处理 AggregateException,除非它特别想要处理。

第二个原因有点微妙。正如我在我的博客(和书中)中所描述的那样,Result/Wait can cause deadlocks , 和 can cause even more subtle deadlocks when used in an async method .因此,当我通读代码并看到 ResultWait 时,这是一个即时警告标志。 Result/Wait 仅在您绝对确定任务已经完成时才是正确的。这不仅很难一目了然(在现实世界的代码中),而且代码更改也更脆弱。

这并不是说 Result/Wait 应该永远被使用。我在自己的代码中遵循这些准则:

  1. 应用程序中的异步代码只能使用await
  2. 异步实用程序代码(在库中)偶尔可以使用 Result/Wait 如果代码确实需要它。这样的用法应该有注释吧。
  3. 并行任务代码可以使用ResultWait

请注意 (1) 是目前为止最常见的情况,因此我倾向于在任何地方都使用 await 并将其他情况视为一般规则的异常(exception)情况。

关于c# - 等待与 task.Result 相同的已完成任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24623120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com