这个问题在这里已有答案:
我有两个可以并行运行的任务来提高性能:
var task1 = _service.DoStuffAsync();
var task2 = _service.DoOtherStuffAsync();
await Task.WhenAll(task1, task2);
现在,我确信这些任务已经完成。但根据我的理解(以及一些现实生活中的头痛),如果我在这些任务上调用.Result
,即使它们完整,我也可能导致死锁?
从我正在阅读的内容来看,await
ing完成的任务只会返回结果,所以看起来就是这样的方式。这使我的代码看起来很时髦:
var task1 = _service.DoStuffAsync();
var task2 = _service.DoOtherStuffAsync();
await Task.WhenAll(task1, task2);
var result1 = await task1;
var result2 = await task2;
这是解决此问题并获得我的任务结果的正确方法吗?如果没有,问题是什么?有没有更好的方法来打开任务而不调用.Result
?
如果我打电话.Result在这些任务上,即使它们完整,我也可能造成僵局?
不,你不能。如果任务完成,Result
将不会阻止,它将立即返回,但更重要的是,当它已经完成时,你无法阻止你正在等待完成的任务。
这是解决此问题并获得我的任务结果的正确方法吗?
它肯定会奏效。你当然是对的,它看起来很傻,因为你冗余地等待任务两次(第二次实际上不会花费任何时间,因为它们已经完成,你只需输入代码等待它们两次)。您可以省略冗余代码,只需等待一次:
var task1 = _service.DoStuffAsync();
var task2 = _service.DoOtherStuffAsync();
var result1 = await task1;
var result2 = await task2;