2016-09-03 5 views
1

.NET Blocking Klasse für mich wirklich gut funktioniert, aber aus irgendeinem Grund die IsCompleted Eigenschaft gibt immer falsch ... selbst wenn die BlockingCollection.Count ist 0.BlockingCollection.IsComplete ist nie wahr

while (!WorkUnits.IsCompleted) 
{ 
    ... 
    // WorkUnits.Count == 0 but IsCompleted stays false 
} 

Wie eine Abhilfe ich kann auf diese Weise aus meinem äußeren while (! blockingCollection.IsComplete) Schleife brechen:

if (WorkUnits.Count == 0) 
{ 
    break; 
} 

Dies funktioniert, aber fügt etwas aufblasen, der wie es bereits arbeiten sollte scheint, aber ich vermute, ich könnte nicht verstehe die IsComplete gut genug, um Werbung zu machen Vorteil davon richtig.

EDIT:

Danke, Mike und Scott! Ich faltete Ihre Vorschläge zusammen und erstellte ein neues öffentliches GitHub-Projekt, GhostLine.

+0

Sie fragen nach einem Threading-Race Bug. Wenn der Count 0 ist, ist er leer. Der Produzent hatte keine Chance, weitere Artikel hinzuzufügen. Nicht vollständig, es kann später einen Gegenstand hinzufügen. Es ist nicht vollständig, bis der Produzent explizit sagt, dass es vollständig ist und verspricht, dass es nie wieder mehr Elemente hinzufügen wird. –

+1

Nur eine Notiz, die normalerweise 'while (! WorkUnits.IsCompleted)' verwendet, ist ein Zeichen, dass Sie mit einer blockierenden Sammlung möglicherweise etwas falsch machen, weil Sie nach Arbeit suchen. Eine viel bessere Lösung ist es oft 'foreach (var item in WorkUnits.GetConsumingEnumerable())' zu verwenden und 'item' in der Schleife zu benutzen, um die Arbeit zu erledigen, die foreach wird blockieren wenn die Sammlung leer ist und die Schleife einmal verlassen' CompleteAdding' wurde aufgerufen und alle Elemente wurden entfernt. –

Antwort

4

Wenn Sie lesen Sie die Dokumentation von BlockingCollection (https://msdn.microsoft.com/en-us/library/dd267312(v=vs.110).aspx) finden Sie das folgende Stück Informationen:

A Herstellung Thread kann die CompleteAdding Methode aufrufen, um anzuzeigen, dass keine weiteren Elemente hinzugefügt werden. Konsumenten überwachen die IsCompleted-Eigenschaft, um zu wissen, wann die Sammlung leer ist und keine weiteren Elemente hinzugefügt werden.

Also, rufen Sie jemals CompleteAdding?