Task.WhenAny - Was passiert mit den verbleibenden laufenden Aufgaben?

8

Ich habe den folgenden Code:

%Vor%

Es startet Aufgaben parallel. Wenn die erste abgeschlossene Aufgabe den Wert true zurückgibt, gibt die Methode true zurück.

Meine Frage ist:

Was passiert mit allen anderen Aufgaben, die gestartet wurden und wahrscheinlich noch im Hintergrund laufen? Ist das der richtige Ansatz, um einen Code auszuführen, der asynchron und parallel ist und nach dem Auftreten der ersten Bedingung zurückkehren sollte, oder es besser ist, sie nacheinander zu starten und einzeln zu warten?

Danke

    
Aleksander Bethke 02.01.2017, 11:57
quelle

1 Antwort

8

Übrigens lese ich gerade Parallelität in C # CookBook , indem < Stephen Cleary , und ich kann hier auf einige Teile des Buches verweisen, denke ich.

Von Rezept 2.5 - Diskussion haben wir

  

Wenn die erste Aufgabe abgeschlossen ist, überlegen Sie, ob die verbleibenden Aufgaben abgebrochen werden sollen. Wenn die anderen Aufgaben nicht abgebrochen, aber auch nie erwartet werden, werden sie aufgegeben. Abgebrochene Aufgaben werden bis zum Abschluss ausgeführt, und ihre Ergebnisse werden ignoriert. Alle Ausnahmen von diesen abgebrochenen Aufgaben werden ebenfalls ignoriert.

     

Ein weiteres Antipattern für Task.WhenAny bearbeitet Aufgaben, wenn sie abgeschlossen sind. Zunächst scheint es ein sinnvoller Ansatz zu sein, eine Liste von Aufgaben zu führen und jede Aufgabe aus der Liste zu entfernen, wenn sie abgeschlossen ist. Das Problem bei diesem Ansatz ist, dass er in O (N ^ 2) -Zeit ausgeführt wird, wenn ein O (N) -Algorithmus existiert.

Abgesehen davon denke ich, dass WhenAny sicherlich der richtige Ansatz ist. Denken Sie nur daran, dem Ansatz des Passierens zu folgen. Leonid das gleiche CancellationToken für jede Aufgabe und annulliere sie, nachdem die erste zurückgegeben wurde. Und zwar nur dann, wenn die Kosten dieser Operationen das System tatsächlich belasten.

    
heltonbiker 02.01.2017, 13:18
quelle