我有两个可以并行运行的任务来提高性能:
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
?
答案 0 :(得分:5)
如果我打电话.Result执行这些任务,即使他们完成了,我也可能造成僵局?
不,你不能。如果任务完成,Result
将不会阻止,它会立即返回,但更重要的是,当它已经完成时,您无法阻止您完成时等待的任务
这是解决此问题的正确方法,并获得我的任务的结果吗?
肯定会工作。当然,你看起来很傻,因为你需要两次冗余地等待任务(第二次真的花了很多时间,因为他们已经完成了,你只是打字输出代码等待他们两次)。您可以省略冗余代码,只需等待一次:
var task1 = _service.DoStuffAsync();
var task2 = _service.DoOtherStuffAsync();
var result1 = await task1;
var result2 = await task2;