Task.WhenAll in async方法,然后展开每个任务[重复]

问题描述 投票:2回答:1

这个问题在这里已有答案:

我有两个可以并行运行的任务来提高性能:

var task1 = _service.DoStuffAsync();
var task2 = _service.DoOtherStuffAsync();

await Task.WhenAll(task1, task2);

现在,我确信这些任务已经完成。但根据我的理解(以及一些现实生活中的头痛),如果我在这些任务上调用.Result,即使它们完整,我也可能导致死锁?

从我正在阅读的内容来看,awaiting完成的任务只会返回结果,所以看起来就是这样的方式。这使我的代码看起来很时髦:

var task1 = _service.DoStuffAsync();
var task2 = _service.DoOtherStuffAsync();

await Task.WhenAll(task1, task2);

var result1 = await task1;
var result2 = await task2;

这是解决此问题并获得我的任务结果的正确方法吗?如果没有,问题是什么?有没有更好的方法来打开任务而不调用.Result

c# async-await task
1个回答
5
投票

如果我打电话.Result在这些任务上,即使它们完整,我也可能造成僵局?

不,你不能。如果任务完成,Result将不会阻止,它将立即返回,但更重要的是,当它已经完成时,你无法阻止你正在等待完成的任务。

这是解决此问题并获得我的任务结果的正确方法吗?

它肯定会奏效。你当然是对的,它看起来很傻,因为你冗余地等待任务两次(第二次实际上不会花费任何时间,因为它们已经完成,你只需输入代码等待它们两次)。您可以省略冗余代码,只需等待一次:

var task1 = _service.DoStuffAsync();
var task2 = _service.DoOtherStuffAsync();

var result1 = await task1;
var result2 = await task2;
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.