Jaka jest różnica pomiędzy Task.WaitAll()
i Task.WhenAll()
od Async CTP? Czy możesz podać przykładowy kod ilustrujący różne przypadki użycia?
c#
asynchronous
async-await
task-parallel-library
Yaron Levi
źródło
źródło
WhenAll
, ale to nie to samo, co blokowanie wątku.Podczas gdy odpowiedź JonSkeeta wyjaśnia różnicę w typowo doskonały sposób, istnieje jeszcze jedna różnica: obsługa wyjątków .
Task.WaitAll
rzucaAggregateException
kiedy rzuca dowolne z zadań i możesz sprawdzić wszystkie zgłoszone wyjątki. Opcjaawait
inawait Task.WhenAll
rozpakowujeAggregateException
i „zwraca” tylko pierwszy wyjątek.Gdy program poniżej zostanie wykonany z
await Task.WhenAll(taskArray)
danymi wyjściowymi, jest on następujący.Gdy poniższy program jest wykonywany z
Task.WaitAll(taskArray)
danymi wyjściowymi, jest on następujący.Program:
źródło
await t1; await t2; await t3;
vsawait Task.WhenAll(t1,t2,t3);
await
, a nie różnicę między tymi dwiema metodami. Obie propagująAggregateException
, rzucając bezpośrednio lub przez właściwość (Task.Exception
właściwość).Jako przykład różnicy - jeśli masz zadanie, robi coś z wątkiem interfejsu użytkownika (np. Zadanie reprezentujące animację w serii ujęć), jeśli
Task.WaitAll()
następnie wątek interfejsu jest zablokowany, a interfejs użytkownika nigdy nie jest aktualizowany. jeśli używasz,await Task.WhenAll()
to wątek interfejsu użytkownika nie jest blokowany, a interfejs użytkownika zostanie zaktualizowany.źródło
Co oni robią:
Co za różnica:
Użyj, gdy:
źródło
WaitAll
jak rozumiem.Task.WaitAll
po wykonaniu innej pracy? Mam na myśli, zamiast nazywać go zaraz po rozpoczęciu zadań.