Task.WhenAll in async方法,然后解开每个任务

时间:2018-01-04 16:24:50

标签: c# async-await task

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

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

await Task.WhenAll(task1, task2);

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

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

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

await Task.WhenAll(task1, task2);

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

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

1 个答案:

答案 0 :(得分:5)

  

如果我打电话.Result执行这些任务,即使他们完成了,我也可能造成僵局?

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

  

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

肯定会工作。当然,你看起来很傻,因为你需要两次冗余地等待任务(第二次真的花了很多时间,因为他们已经完成了,你只是打字输出代码等待他们两次)。您可以省略冗余代码,只需等待一次:

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

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