WaitAll和WhenAll有什么区别?

21

我有这段代码:

List<ComponentesClasificaciones> misClasificaciones = new List<ComponentesClasificaciones>();
            Task tskClasificaciones = Task.Run(() =>
                {
                    misClasificaciones = VariablesGlobales.Repositorio.buscarComponentesClasificacionesTodosAsync().Result;
                });

Task.WhenAll(tskClasificaciones);

List<ComponentesClasificaciones> misVClasificacionesParaEstructuras = new List<ComponentesClasificaciones>(misClasificaciones);
如果我使用Task.WhenAllmisClasificaciones没有任何元素,但是当我使用await时,我会得到我请求数据库的所有元素。
何时使用WhenAll,何时使用WaitAll

1
您可以使用await Task.WhenAll而不会阻塞调用线程。 - L.B
异常处理也有所不同,请参见https://dev59.com/4G025IYBdhLWcg3wQDdb。 - tymtam
2个回答

27

MSDN讲解得很好。两者之间的区别非常明显。

Task.WhenAll:

创建一个任务,当所有提供的任务完成时,该任务将完成。

Task.WaitAll:

等待所有提供的任务对象执行完成。

所以,实质上,WhenAll给你一个任务,直到你给它的所有任务都完成后才会完成(并立即允许程序执行),而WaitAll则只是阻塞并等待你传递的所有任务完成。


18

WhenAll 方法返回一个任务,一旦所有指定的任务都完成,您就可以使用 ContinueWith 方法继续执行。您应该这样做:

Task.WhenAll(tskClasificaciones).ContinueWith(t => {
  // code here
});

基本上,当您想同步获取结果时,请使用WaitAll,当您想启动新的异步任务以开始更多处理时,请使用WhenAll


2
在这里使用ContinueWith和仅在返回的任务上使用await有什么区别? - Vapid
我认为@Vapid提出了一个好问题。 - Álvaro García

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接