Was ist der Unterschied zwischen Task.WaitAll()
und Task.WhenAll()
vom Async CTP? Können Sie einen Beispielcode bereitstellen, um die verschiedenen Anwendungsfälle zu veranschaulichen?
c#
asynchronous
async-await
task-parallel-library
Yaron Levi
quelle
quelle
WhenAll
, aber das ist nicht dasselbe wie das Blockieren des Threads.Während die Antwort von JonSkeet den Unterschied auf typisch hervorragende Weise erklärt, gibt es einen weiteren Unterschied: die Ausnahmebehandlung .
Task.WaitAll
löst eine aus,AggregateException
wenn eine der Aufgaben ausgelöst wird, und Sie können alle ausgelösten Ausnahmen untersuchen. Dasawait
inawait Task.WhenAll
packt das ausAggregateException
und gibt nur die erste Ausnahme zurück.Wenn das folgende Programm mit
await Task.WhenAll(taskArray)
der Ausgabe ausgeführt wird, ist dies wie folgt.Wenn das folgende Programm mit
Task.WaitAll(taskArray)
der Ausgabe ausgeführt wird, ist wie folgt.Das Programm:
quelle
await t1; await t2; await t3;
vsawait Task.WhenAll(t1,t2,t3);
await
und nicht als einen Unterschied zwischen den beiden Methoden. Beide verbreiten einenAggregateException
, entweder direkt oder durch eine Eigenschaft (dieTask.Exception
Eigenschaft).Als Beispiel für den Unterschied: Wenn Sie eine Aufgabe haben, führt dies etwas mit dem UI-Thread aus (z. B. einer Aufgabe, die eine Animation in einem Storyboard darstellt), wenn Sie
Task.WaitAll()
dann den UI-Thread blockieren und die UI nie aktualisiert wird. Wenn Sie verwenden,await Task.WhenAll()
wird der UI-Thread nicht blockiert und die UI wird aktualisiert.quelle
Was machen Sie:
Was ist der Unterschied:
Verwenden Sie welche, wenn:
quelle
WaitAll
wie ich es verstehe.Task.WaitAll
nachdem du deine andere Arbeit erledigt hast? Ich meine, anstatt es gleich nach dem Start Ihrer Aufgaben aufzurufen.