2011-01-06 6 views
11

Ich denke über die Verwendung einer ConcurrentBag in einem Programm, das ich schreibe, aber ich kann nicht genug Dokumentation auf TryTake finden.Unter welchen Umständen kann ConcurrentBag.TryTake() fehlschlagen?

Ich verstehe, dass die Methode fehlschlagen kann, aber ich kann keine Erklärung für die Fälle finden, in denen ein solcher Fehler auftreten könnte, und in welchem ​​Zustand die Sammlung nach dem Fehler verbleibt.

Wenn es nur im Fall eines anderen Threads ist, der das Element bereits entfernt hat, ist es mir egal, aber was ich mir nicht wirklich leisten kann, ist das Element, das ich entfernen möchte, um nach dem Anruf noch in der Sammlung zu sein.

Kann dies jemals der Fall sein?

+1

Einige Code (das fehlschlägt) und Details der Ausnahme, die Sie bekommen, würden helfen! – decyclone

+6

@decyclone, er hat keinen Code, der fehlschlägt, er fragt, unter welchen Bedingungen die TryTake-Methode fehlschlagen könnte und wie der Zustand der Sammlung nach dem Fehler sein würde. –

Antwort

3

Aus der Dokumentation wird false zurückgegeben, wenn kein Artikel verfügbar ist, d. H. Der Beutel ist leer. Da es sich um eine threadsichere Sammlung handelt, sollte es keine Probleme mit "leeren" und mehreren Threads geben.

Sie haben die Dokumentation für result T sowie die return value zu berücksichtigen:

Ergebnis T: Wenn diese Methode zurückgibt, Ergebnis enthält das Objekt aus dem ConcurrentBag oder den Standardwert von T entfernt, wenn die Tasche ist leer.

Rückgabe: Wahr, wenn ein Objekt erfolgreich entfernt wurde; sonst falsch.

http://msdn.microsoft.com/en-us/library/dd287255.aspx

+1

Gute Interpretation, aber schlechte Dokumentation ... – em70

3

Vorausgesetzt, dass Sie mit Multithreading zu tun haben, gibt es nichts, einen weiteren Thread von Zugabe ein Element in der Tasche zwischen dem Moment, zu stoppen, zu dem TryTake false zurück hat entscheiden (und legen Sie es Rückgabewert an default(T)), und der Moment, zu dem der Aufruf an TryTake tatsächlich zu Ihrem Code zurückkehrt.

Wenn Sie mit dem falschen Ergebnis umgehen können, ist möglicherweise tatsächlich ein Artikel in der Tasche.

+0

Danke, aber der Code beteiligt ist nur sicherstellen, dass eine bestimmte Ressource nur einmal pro Benutzer verwendet wird, also wenn der Benutzer beschließt, eine Abmeldung kurz gefolgt von einer Anmeldung und für einige zu senden Weil die beiden zufällig fast gleichzeitig verarbeitet werden, ist das kein Grund zur Besorgnis. Unfähigkeit, sich abzumelden oder unsachgemäße Abmeldung zu behandeln, wäre jedoch ein Problem gewesen, daher die Frage. – em70

Verwandte Themen