2016-08-26 4 views
5

Bestellung Ich lese Dataflow (Task Parallel Library), und es ist ein Teil, der sagt:Verständnis TPL Datenfluss Parallelitätsgrad

Wenn Sie einen maximalen Grad an Parallelität angeben, der größer als 1 ist, werden gleichzeitig mehr Nachrichten verarbeitet und Daher werden Nachrichten möglicherweise nicht in der Reihenfolge verarbeitet, in der sie empfangen werden. Die Reihenfolge, in der die Nachrichten vom Block ausgegeben werden, ist jedoch korrekt geordnet.

Was bedeutet das?

Beispiel, stelle ich meinen Aktionsblock mit dem Grad der Parallelität = 5:

testActionBlock = new ActionBlock<int>(i => Consumer(i), 
      new ExecutionDataflowBlockOptions() 
      { 
       MaxDegreeOfParallelism = 5 
      }); 

await Producer(); 
testActionBlock.Completion.Wait(); 

Mein Produzent() grundsätzlich Warteschlange Zahlen in den Block:

private async Task Producer() 
{ 
    for (int i=0; i<= 1000; i++) 
    { 
     await testActionBlock.SendAsync(i); 
    } 
    testActionBlock.Complete(); 
} 

Und mein Consumer (i) nur schreiben die Linien:

private async Task Consumer(int i) 
{ 
    if (i == 1) 
    { 
     await Task.Delay(5000); 
    } 
    Console.WriteLine(i); 
} 

ist es bedeutet, dass Verbraucher (2) wird bis zum Endverbraucher blockiert werden (1) ha s abgeschlossene Verarbeitung (da es eine Verzögerung von 5 Sekunden gibt)? Ich habe den Code getestet und es scheint nicht der Fall zu sein. Selbst wenn ich die Verzögerung von 5 Sekunden entfernte, sehe ich nicht, dass die Ausgabe in Ordnung ist.

[Update]

bBlock = new BufferBlock<int>(option); 

testActionBlock = new ActionBlock<int>(i => Consumer(i), 
    new ExecutionDataflowBlockOptions() 
    { 
     MaxDegreeOfParallelism = 5 
    }); 

bBlock.LinkTo(testActionBlock); 

await Producer(); 
testActionBlock.Completion.Wait(); 

Mein Produzent() wird nun den BBLOCK hinzufügen:

private async Task Producer() 
{ 
    for (int i=0; i<= 1000; i++) 
    { 
     await bBlock.SendAsync(i); 
    } 
    bBlock.Complete(); 
} 

Also, in diesem Fall für Endverbraucher (1) wird für 5 Sekunden warten, bevor Consumer (2) fortfahren kann?

Antwort

3

Nr DoP können Sie als Fäden denken (nicht genau, aber einfache Möglichkeit, daran zu denken)

So bei 5, wird versuchen, 5 zu einem Zeitpunkt, zu verarbeiten. Da die # 1 5 Sekunden dauert, wird # 2 sicherlich zuerst beendet. Wahrscheinlich werden das # 3, # 4 und # 5 sein. Vermutlich sogar # 6 (da # 2 fertig ist, wird das DoP es erlauben auf # 6 zu starten)

Auch ohne eine Verzögerung gibt es keine garantierte Reihenfolge für die Verarbeitung. Also nie auf die ORDER, dass sie ausführen. Wenn Sie die Nachrichtenausgaben verwenden (NICHT prttinting, da diese Reihenfolge ausgeführt wird), werden sie in der Reihenfolge neu sortiert, in der sie gekommen sind, obwohl sie in einer beliebigen Reihenfolge ausgeführt wurden.

+0

danke für die Klarstellung. Aber ich bin immer noch unklar, wenn gesagt wird "Nachrichtenausgaben ... werden neu sortiert". Ich habe meine ursprüngliche Frage aktualisiert, um zu sehen, ob mein Verständnis korrekt ist. – SimonSays

+0

Der TPL-Datenfluss bietet einen vollständigen Messaging-Mechanismus, mit dem Daten in die Blöcke hinein und aus ihnen herausgelöst werden können. Sehen Sie sich diesen großartigen Guide von MS mit exakten Beispielen an. https://msdn.microsoft.com/en-us/library/hh228597(v=vs.110).aspx – Tim