【问题标题】:.Result or await after Task.WhenAll [duplicate].Result 或在 Task.WhenAll 之后等待 [重复]
【发布时间】:2020-10-08 18:03:01
【问题描述】:

我有两个任务,我等待它们完成

await Task.WhenAll

之后直接调用.Result获取值会不会有问题

我确定任务已经完成了。

`

        Task<int> t1 = Task.FromResult(1);
        Task<int> t2 = Task.FromResult(2);
        await Task.WhenAll(t1, t2);
        var uuu = t1.Result; 
        // or var uuu = await t1;

`

问题在于 Visual Studio 设置了 VSTHRD103 Call async methods when in an async method 警告。

我检查了sharplab,结果版本 jit 有点小。

如果我调用.Result 之后我已经用Task.WhenAll 等待他们,我会遇到任何僵局吗?

【问题讨论】:

标签: c# asynchronous task


【解决方案1】:

没有问题,因为任务已经完成了。这是一个误报,可以忽略。

如果所有任务返回相同的结果,Task.WhenAll 会返回一个包含结果的数组:

var results=await Task.WhenAll(tasks);

结果与产生它们的任务的顺序相同

【讨论】:

  • 你似乎是对的,但我想确定 100%
  • 我同意这个答案——在等待任务之后使用.Result 是完全可以的。我唯一要补充的是,再次await 也是可以的,这会给你同样的结果,而且可能更安全。
  • 如重复显示,在此答案中明确未涵盖的情况下确实存在差异 - 当 Result 不产生结果时。 @ygalbel 确保也检查重复项
  • await 不是免费的。 Check the issue raised about the analyzer warning ,您会看到由于状态机代码,额外的等待会增加应用程序的大小:I also work on the Cortana UWP app and adding four extra await's adds 10-20KB to the app size which is to be avoided. It also hits performance a little.
猜你喜欢
  • 2023-03-26
  • 2016-08-22
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多