Ich verstehe, dass C# -Wörterbücher nicht Thread-sicher sind, wenn es darum geht, Elemente hinzuzufügen, zu lesen und zu entfernen; Können Sie jedoch auf die Thread-Eigenschaft eines C# -Verzeichnisses threadsicher zugreifen, wenn ein anderer Thread das Wörterbuch schreibt, liest und aus dem Wörterbuch entfernt?Multi-Thread-Zugriff auf C# -Wörterbuch
Antwort
Sie könnten das Wörterbuch als statisches readonly-Objekt erstellen, und lock
es bei der Änderung ... das sollte mit den meisten Problemen umgehen, würde ich denken.
Da Eigenschaft ist ein Methodenaufruf unter der Dunstabzugshaube so wirklich Situation ist nicht so einfach wie auf den ersten Blick.
- T1: Zugreifen Count Eigenschaft
- T1: get_Count() Aufruf (eine Art von JMP/GOTO ASM-Befehl)
- T1: Lesen Variable, die eine Anzahl von Elementen darstellt == 1
- T2 : addign ein neues Element, Realzahl wird 2
- T1: Erträge 1 aber eigentlich gibt es bereits zwei Artikel
Also, wenn eine Anwendungslogik setzt auf eine Count
Eigenschaftswert - theoretisch könnten Sie mit race condition enden.
Da die Eigenschaft nicht direkt geschrieben werden kann, ist es überhaupt nicht in Ordnung, davon gleichzeitig zu lesen. Letzteres folgt nicht dem ersteren. Das ist gefährliches Denken. – usr
richtig Ich war gerade dabei, meine Antwort zu schreiben, anfangs dachte ich falsch, du hast Recht – sll
Es sollte threadsicher darin sein, dass es nicht explodiert, aber ich bin ziemlich sicher, es ist nicht threadsicher darin, dass es Ihnen möglicherweise nicht die korrekte Zählung gibt, weil andere Threads das Wörterbuch manipulieren.
[Edit: wie Usr darauf hinweist, nur weil es derzeit threadsafe auf dieser Ebene ist, bedeutet nicht, dass es so weiter sein wird. Sie haben keine Garantien]
Je nachdem, was Sie erreichen möchten, können Sie das Wörterbuch mit einer ReaderWriterLockSlim schützen. Auf diese Weise können Sie schnellere Lesevorgänge ausführen und das Wörterbuch nur sperren, wenn Sie Mutationsoperationen ausführen.
Anstatt davon aus, ging ich und sah in Reflektor es:
public int Count
{
get
{
// count and freeCount are local fields
return (this.count - this.freeCount);
}
}
Also ja, es „Thread-sicher“, dass es den Zugriff verursacht Korruption nicht im Wörterbuch Objekt. Das heißt, ich bin mir nicht sicher, ob ich an einen Anwendungsfall denken kann, bei dem es wichtig ist, die Zählung mit Genauigkeit zu erhalten, wenn auf das Wörterbuch von einem anderen Thread zugegriffen wird.
'if (dict.Count == 1)' würde nie * sicher * arbeiten –
@L.B hast du den Absatz am Ende meiner Antwort gelesen? –
Denkst du, ich schreibe einfach Kommentare, ohne die ganze Antwort zu lesen? "Ich kann mir einen Anwendungsfall vorstellen, bei dem es wichtig ist, die Zählung mit einiger Genauigkeit durchzuführen, wenn das Wörterbuch von einem anderen Thread aufgerufen wird." Korrekt, aber begrenzt mit Ihrer Vorstellungskraft. –
Erstens: Dies ist ein gefährliches Denken. Sei sehr vorsichtig, wenn du so etwas in Produktion bringst. Wahrscheinlich sollten Sie nur eine Sperre oder ConcurrentDictionary verwenden.
Sind Sie mit einer ungefähren Antwort zufrieden?
Aber: Reflektor zeigt, dass count nur ein Feld liest und es zurückgibt. Dies wird sich wahrscheinlich nicht für immer ändern. Sie könnten also in diesem Fall vernünftigerweise das Risiko eingehen.
- 1. C# ein Wörterbuch Lambdas
- 2. C# Wörterbuch HashSet
- 3. C# Wörterbuch mit ReaderWriterLockSlim
- 4. C# Wörterbuch Leistung
- 5. Ändern C# -Wörterbuch Wert
- 6. C# -Wörterbuch, 2 Werte
- 7. Convert Json Wörterbuch C#
- 8. Einfaches Wörterbuch in C++
- 9. C# -Wörterbuch in TypeScript?
- 10. Python Wörterbuch Bezug auf Nachbarn-Wörterbuch Element
- 11. Wörterbuch Sortieren auf unteren Wörterbuch Wert basiert
- 12. C# - JSON Serialisierung von Wörterbuch
- 13. Enthält in Wörterbuch in C#
- 14. C# Liste als Wörterbuch Schlüssel
- 15. Looping über Wörterbuch in C#
- 16. Faule Wörterbuch Eigenschaften in C#
- 17. Namenskonvention für ein C# -Wörterbuch
- 18. F # Karte zu C# Wörterbuch
- 19. Umkehren Wörterbuch LINQ in C#
- 20. C# Wörterbuch initializer Kompilation Inkonsistenz
- 21. C# out-Parameter und Wörterbuch
- 22. C# assoziative Array mit Wörterbuch
- 23. C# Load-Wörterbuch von XML
- 24. Klärung von Lesen und Schreiben auf einer C# Wörterbuch
- 25. So rufen Sie das vollständige Wörterbuch in C auf #
- 26. Wörterbuch innerhalb Wörterbuch in Javascript
- 27. Weak-Keyed-Wörterbuch in Objective-C
- 28. Mit Karte auf einem Wörterbuch in Swift 2, einem Wörterbuch
- 29. C# Speichern von Funktionen in einem Wörterbuch
- 30. Gebäude Wörterbuch im Wörterbuch
Erwarten Sie, dass der richtige Wert zurückgegeben wird? –
Oder verwenden Sie einfach ein ConcurrentDictionary ... http://msdn.microsoft.com/en-us/library/dd287191.aspx –