2017-05-21 4 views
0

Ich erstelle derzeit eine Engine, die 10 neue Threads erstellen wird, die unterschiedliche Arbeit leisten. Aber ich habe festgestellt, dass meine Lösungsdosis nicht parallel läuft.Parallele Verwendung von Aufgaben

public async Task Start(Func<string, Task> action) 
{ 
    for (var i = 1; i <= config.threads; i++) 
    { 
     consumers.Add(getActionTask(action)); 
    } 

    await Task.WhenAll(consumers); 
} 

private Task getActionTask(Func<string, Task> action) 
{ 
    return Task.Run(async() => 
    { 
     // Do something that returns a string 
     String data = "Some string here"; 
     await action(data); 
    } 
} 

Nimmt sich i 2 Fäden laufen, und auf Basis von Daten wird der erste Thread einen Task.Delay(TimeSpan.FromSeconds(30)); den zweiten Thread tun „hallo“ auf einer Schleife drucken.

Es wird nie die Druckschleife erhalten, bevor die Verzögerung vorbei ist, was ist falsch an meiner Implementierung?

+0

Können Sie den Code mit den Delay- und Print-Anweisungen posten? By the way, wickle die 'await action (data)' nicht in einen Aufruf von Task.Run, nicht notwendig. Die Methode 'getActionTask' sollte nur' action (data); ' –

Antwort

0

Die Task.WhenAll sagt nicht, dass die Aufgaben parallel ausgeführt werden. Es erstellt eine Task, die abgeschlossen wäre, sobald alle Aufgaben, die Sie als ein Argument an die WhenAll-Methode übergeben, abgeschlossen werden. Wenn Sie möchten, dass Ihr Code parallel läuft, sollten Sie die Parallel Klasse ForEach Methode verwenden.

aktualisiert

Ein wichtiger Hinweis, wie Scott unten wies darauf hin, in seinem Kommentar, dass die Funktionen in der Parallel Klasse mit Asynchron-Methoden nicht funktionieren. Wenn Sie asynchrone Methoden verwenden möchten, müssen Sie stattdessen TPL Dataflow verwenden.

+2

zurückgeben. Eine wichtige Sache zu beachten, funktionieren die Funktionen in der' Parallel' Klasse nicht mit asynchronen Methoden. Wenn Sie asynchrone Methoden verwenden möchten, müssen Sie stattdessen ['TPL Dataflow'] (https://msdn.microsoft.com/en-us/library/hh228603 (v = vs.110) .aspx) verwenden. –

+0

@ScottChamberlain Vielen Dank für die Kenntnisnahme! Ich werde es in meine Antwort aufnehmen. – Christos