【发布时间】:2013-09-15 19:59:54
【问题描述】:
在下面的代码中task1和task2是相互独立的,可以并行运行。以下两种实现有什么区别?
var task1 = GetList1Async();
var task2 = GetList2Async();
await Task.WhenAll(task1, task2);
var result1 = await task1;
var result2 = await task2;
和
var task1 = GetList1Async();
var task2 = GetList2Async();
var result1 = await task1;
var result2 = await task2;
为什么我应该选择一个而不是另一个?
编辑:我想补充一下 GetList1Async() 和 GetList2Async() 方法的返回类型是不同的。
【问题讨论】:
-
I4v,在第一种情况下,
var result = await task1;与var result = task1.Result完全相同。我确实认为.Result更具可读性。 -
@I4V 不。在这两个 sn-ps 中,任务是并行运行的,而不是顺序运行的。
-
@dcastro,他们不一样。在出现异常的情况下,使用 .Result 会产生不同的异常(
AggregateException),而不是使用await(第一个异常),因此在使用async/await时,您应该更喜欢使用await而不是@987654331 @ 保持异常行为一致。 -
但是如果有异常会在 await all 的时候抛出,而且你永远不会到达下面的两行。假设您确实到达了下面的两行,您可以 .Result 而不用担心异常或死锁,因为它保证任务已经完成。参考stackoverflow.com/a/24657079/1676558。
-
我正在搜索这个案例,但仍然找不到我需要的文档。但是有一些人说:一旦你调用了一个异步方法,任务就会在调用时自动启动,并且 await 只等待它完成,如果任务完成它只返回结果。所以 await Task.WhenAll 在这种情况下只会增加更多的可读性。但是在几次看到这样的答案之后,我仍然不确定,如果你看过文档,你可能想在这里与我们分享。
标签: c# task-parallel-library async-await