2012-12-31 9 views
23

Wann sollte ich async/abwarten und wann sollte ich parallel.foreach in C# verwenden? Sind parallel und async/erwarten den gleichen Zweck? Was sind die Unterschiede in ihnen?Async/erwarten und parallel in C#

+0

Siehe diese verwandte Frage: http://stackoverflow.com/questions/9898441/do-the-new-c-sharp-5-0-async-and-await-keywords-use -multiple-cores –

+0

Sehen Sie, wie Sie Async-Operationen parallel aufrufen https://StackOverflow.com/questions/11564506/nesting-await-in-parallel-foreach/11565531#11565531 –

Antwort

72

Async/erwarten ist etwa Asynchronität, während Parallel.ForEach ist etwa Parallelität. Sie sind verwandte Konzepte, aber nicht dasselbe.

Parallel.ForEach wird verwendet, wenn Sie denselben Vorgang für alle Elemente in einer Auflistung parallel ausführen und den aktuellen Thread blockieren möchten, bis alle Vorgänge abgeschlossen sind.

async/await wird verwendet, wenn die aktuelle Operation keine weiteren Fortschritte machen kann, bis eine bestimmte asynchrone Operation abgeschlossen ist, Sie jedoch den aktuellen Thread nicht blockieren möchten. Dies ist besonders in zwei Situationen nützlich:

  • Schreiben von Code, der nacheinander verschiedene asynchrone Vorgänge nacheinander auf dem UI-Thread startet und zwischen den Vorgängen kurz auf die UI zugreift. (Es ist allgemeiner, aber das ist ein einfaches Beispiel.) Sie möchten den UI-Thread nicht blockieren, aber die Verwaltung all dieser asynchronen Operationen ist ansonsten ein Problem.
  • Handhabung Lose von lang andauernden Operationen zu einer Zeit - z.B. in einem Webserver. Jede einzelne Anfrage kann aufgrund des Aufrufs anderer Webdienste, Datenbanken usw. sehr lange dauern. Sie möchten jedoch nicht einen Thread pro Anfrage haben, da Threads eine relativ teure Ressource sind.
  • Sie können Parallelität und Asynchronität kombinieren, indem Sie eine neue Aufgabe starten, die Parallel.ForEach aufruft und dann auf diese Aufgabe wartet. (Nur als ein Beispiel.)