sagen, dass ich diese Funktion haben (ich nehme an Cache in einem Thread-Weg bin Zugriff):Prevent zwei Threads einen Codeblock mit dem gleichen Wert eingeben
object GetCachedValue(string id)
{
if (!Cache.ContainsKey(id))
{
//long running operation to fetch the value for id
object value = GetTheValueForId(id);
Cache.Add(id, value);
}
return Cache[id];
}
ich zwei Threads verhindern wollen, laufen die "lang andauernder Betrieb "zur gleichen Zeit für den gleichen Wert. Offensichtlich kann ich das Ganze in eine lock() schreiben, aber dann würde die ganze Funktion unabhängig vom Wert blockieren und ich möchte, dass zwei Threads den lang andauernden Vorgang durchführen können, solange sie nach verschiedenen IDs suchen.
Gibt es einen eingebauten Mechanismus Sperren basierend auf einem Wert zu sperren, so ein Thread blockieren kann, während der andere Thread den lange laufenden Betrieb abgeschlossen, so muß ich es nicht zweimal tun (oder N-mal)? Im Idealfall, solange die lang andauernde Operation in einem Thread ausgeführt wird, sollte kein anderer Thread dies für denselben ID-Wert tun können.
Ich könnte meine eigenen rollen, indem ich die IDs in ein HashSet setze und sie dann entferne, sobald die Operation abgeschlossen ist, aber das scheint ein Hack zu sein.
Sie auf String.intern (id) eine Sperre tun könnte. Aber dann solltest du dir verdammt sicher sein, dass deine "id" Zeichenkette in deiner App sehr (!) Einmalig ist;) – igrimpe