Ich habe den folgenden Code:
%Vor% Methode Update
kann in zwei oder mehr Threads ausgeführt werden und ich verwende lock
, um Probleme mit der Konsistenz mit foo
zu verhindern. Aber ich möchte nur die Foo
sperren, die ähnliche Id
haben. Wenn beispielsweise ein Thread die Methode Update
mit Foo.Id = 1 ausführt und ein anderer Thread Update
mit Foo.Id = 2 ausführt, dann wird lock
nicht benötigt und wenn zwei Threads Update mit zwei Instanzen Foo
mit dem ausführen selbe Id
, lock
wird benötigt. Ist es möglich, ein solches Schloss zu erstellen?
Sie können ConcurrentDictionary<TKey, TValue>
zum Speichern Ihrer Sperren verwenden .
Und benutze es in Update-Methode:
%Vor%Sie können diese Klasse verwenden, um ein Sperrobjekt für jede Id zu erhalten:
%Vor%Halten Sie dann eine Instanz davon in Ihrer Klasse:
%Vor%Die Verwendung ist einfach:
%Vor% Sie können nur lock(foo)
, wenn Sie sicher sind
foo
zum Sperren von Id
Sie können int Id
nicht sperren.
Leider verwende ich verschiedene Instanzen von Foo mit der gleichen ID
Dann könnten Sie pro ConcurrentDictionary<int, object>
versuchen, einen anderen _locker pro Id zu speichern. Aber das bringt zusätzlichen Aufwand und das Problem, das Dictionary zu bereinigen, wenn Sie es längere Zeit ausführen.
Tags und Links c# multithreading concurrency locking