Mam następujący scenariusz:Lepsza rada zamek Wątek potrzebne
próbuję zablokować wątek na miejscu, jeśli jest to zwyczaj 'id wątki odpowiada ten, który został już wprowadzony zablokowaną sekcję kodu, ale nie, jeśli identyfikator jest różny.
stworzyłem przykładowy kod wyjaśnić zachowanie chcę
class A
{
private static Dictionary<int, object> _idLocks = new Dictionary<int, object>();
private static readonly object _DictionaryLock = new object();
private int _id;
private void A (int id)
{
_id = id;
}
private object getObject()
{
lock (_DictionaryLock)
{
if (!_idLocks.ContainsKey(_id))
_idLocks.Add(_id, new object());
}
lock (_idLocks[_id])
{
if (TestObject.Exists(_id))
return TestObject(_id);
else
return CreateTestObject(_id);
}
}
}
Teraz to działa w 100% za to, co inne, gdzie przykładem id 1 nie sprawdzić, czy jej przedmiot został stworzony, podczas gdy inny wątek o id 1 jest już zajęty tworzeniem tego obiektu.
Ale posiadanie dwóch zamków i statycznego słownika nie wydaje się właściwym sposobem robienia tego, więc mam nadzieję, że ktoś może pokazać mi ulepszoną metodę zatrzymywania wątku przed dostępem do kodu tylko wtedy, gdy ten wątek został utworzony za pomocą ten sam identyfikator co ten, który już zajęty jest wykonywaniem kodu w zablokowanej sekcji.
Patrzyłem na klasę ReaderWriterLockSlim, ale dla mnie nie miało to sensu, ponieważ nie chcę, aby obiekt TestObject (id) był w ogóle czytany, gdy jest jeszcze tworzony.
Nie przejmuję się blokowaniem wątku przed dostępem do słownika. Za wszelką cenę próbuję uniknąć _id, w którym ten wątek działa, nie powinien być używany wewnątrz CreateTestObject(_id)
, podczas gdy jest już zajęty, ponieważ pliki są tworzone i usuwane z tym identyfikatorem, który będzie zgłaszał wyjątki, jeśli dwa wątki próbują aby uzyskać dostęp do tych samych plików
Które można naprawić za pomocą zwykłej blokady, ale w tym przypadku nadal chcę wątku, którego _id nie jest obecnie uruchomiony w metodzie CreateTestObject(_id)
, aby móc wprowadzić kod w zamku.
To wszystko dlatego, że to, co dzieje się wewnątrz obiektu CreateTestObject, wymaga czasu i wydajności, jeśli wątek oczekuje na dostęp do niego.
Czy można zablokować cały słownik '_idLocks' zamiast dwóch blokad? Jestem całkiem nowy w blokowaniu, więc nie jestem pewien, co możesz użyć jako obiektu blokady, czy nie. –