Diese Frage bezieht sich auf ein sehr spezifisches und häufiges Szenario, in dem ein Wörterbuch für das On-Demand-Caching von Elementen in einer Multithread-Umgebung verwendet wird. Um Thread-Locking zu vermeiden, ist es besser, nach einem bestehenden Cache-Element außerhalb einer Synchronisationssperre zu suchen, aber wenn wir anschließend ein Element hinzufügen müssen, zählt das als ein Schreiben in das Wörterbuch und daher ist der beste Rat, den ich auf Stackoverflow gelesen habe Sie müssen sowohl den Lese- als auch den Schreibvorgang sperren, da der interne Status des Wörterbuchs möglicherweise durch die Aufrufe von add() geändert wird.Ist ein Dictionary <K,V> Thread für simultanes Lesen und Addieren sicher?
Wenn Sie jedoch durch Microsofts AjaxControlToolkit (scriptObjectBuilder-Klasse) suchen, führt der Code TryGet() außerhalb von Sperren aus und sperrt nur neue Elemente (Add) zum Wörterbuch. Ich kann sehen, wie das möglich ist, wenn der Eimer, in den ein Gegenstand gelegt wird, sich nie ändert, sobald er hinzugefügt wird, aber mein Verdacht ist, dass dies falsch ist und eine Quelle von Fehlern sein könnte.
Danke.
UPDATE Gehen durch die .Net-Dokumentation Ich denke, dass das beschriebene Muster in der Tat falsch ist. Allerdings habe ich mich gefragt, ob die spezielle Implementierung von Dictionary es erlaubt und dass das AjaxControlToolkit darauf angewiesen ist (was zweifelhaft wäre). Bei der Überprüfung des Codes in Reflector bin ich mir ziemlich sicher, dass dies in der Tat falsch ist, die Dictionary.Resize() -Methode weist die Anzahl der Buckets neu zu und verschiebt Bucket-Elemente umher, sodass jeder Thread in der Mitte eines TryGet() möglicherweise funktionieren könnte auf instabilen Daten.
UPDATE Ein Fehler wurde bereits gegen das AjaxControlToolkit auf Codeplex protokolliert. Siehe:
haben Sie es versucht? Client-seitiges Scripting ist normalerweise single-threaded. Standardvorbehalte gelten. –
Haben Sie schon einmal versucht, ein Testkabel zu schreiben? Ich wäre interessiert zu sehen, ob dies auch ein Problem verursacht. –
Dies ist der Ajax-Code auf der Serverseite.Es gibt Thread-Sync's, weil es an Orten statische Dictionary verwendet, um Daten zwischenzuspeichern. – redcalx