.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.
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. –
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. –