2

Ich mag würde wissen, was der empfohlene Weg ist, mehrere asynchrone Methoden parallel auszuführen?ActionBlock <T> vs Task.WhenAll

in System.Threading.Tasks.Dataflow können wir den maximalen Grad der Parallelität angeben, aber unbegrenzt ist wahrscheinlich die Standardeinstellung für Task.WhenAll auch?

dies:

var tasks = new List<Task>(); 
foreach(var item in items) 
{ 
    tasks.Add(myAsyncMethod(item)); 
} 
await Task.WhenAll(tasks.ToArray()); 

oder dass:

var action = new ActionBlock<string>(myAsyncMethod, new ExecutionDataflowBlockOptions 
     { 
      MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded, 
      BoundedCapacity = DataflowBlockOptions.Unbounded, 
      MaxMessagesPerTask = DataflowBlockOptions.Unbounded 
     }); 
foreach (var item in items) { } 
{ 
    action.Post(item); 
} 
action.Complete(); 

await action.Completion; 
+0

'Parallel.ForEach()'? –

+1

Parallel und async nicht so gut, und die Methoden sind async (ich kann sie nicht ändern) –

+1

Der 'Task.WhenAll' Code, den Sie gezeigt haben, hat nichts mit der Ausführung von Aufgaben parallel zu tun - irgendwelche Entscheidungen über die Verwendung von z.B Thread-Pool-Threads, Parallelismus usw. passieren in 'myAsyncMethod', was (vermutlich) heiße' Task's zurückgibt. –

Antwort

1

Ich würde gerne wissen, was ist die empfohlene Möglichkeit, mehrere asynchrone Methoden parallel auszuführen?

Randbemerkung: eigentlich nicht parallel, aber gleichzeitige.

in System.Threading.Tasks.Dataflow können wir den maximalen Grad der Parallelität angeben, aber unbegrenzt ist wahrscheinlich der Standardwert für Task.WhenAll zu?

Als jemand kommentierte, fügt Task.WhenAll nur vorhandene Aufgaben hinzu; Zu dem Zeitpunkt, zu dem Ihr Code Task.WhenAll erreicht, wurden alle Parallelitätsentscheidungen bereits getroffen.

können Sie Ebene asynchronen Code drosseln durch so etwas wie SemaphoreSlim verwenden.

Die Entscheidung, ob asynchrone Parallelität direkt oder TPL Dataflow verwendet werden soll, hängt vom umgebenden Code ab. Wenn diese gleichzeitige Operation nur einmal asynchron aufgerufen wird, ist asynchrone Parallelität die beste Wette; Wenn diese gleichzeitige Operation Teil einer "Pipeline" für Ihre Daten ist, passt TPL Dataflow möglicherweise besser.

0

Beide Methoden sind akzeptabel und die Wahl sollte durch Ihre Anforderungen geregelt werden, wie Sie sehen können Datenfluss gibt Ihnen eine Menge an Konfigurierbarkeit, Sie würden Andernfalls müssen Sie manuell implementieren, wenn Sie Aufgaben direkt verwenden.

Beachten Sie, dass der Task-Pool in beiden Fällen wird zum Einreihen und läuft die Aufgaben verantwortlich sein, so das gleiche Verhalten die gleiche remaing soll.

Datenfluss ist gut Verkettungs zusammen Gruppen von zusammensetzbare asynchronen Operationen während Aufgaben mit Ihnen gibt feinkörnige Kontrolle.

+0

ok, wenn es nur für die Parallelität ist, ohne es als echte Vorteile verketten? –

+0

Wenn Sie keine Verkettung oder Zusammensetzung benötigen, ist es vielleicht zu viel, ja – Slugart