ConcurrentDictionary: TryRemove внутри блокировки?C#

Место общения программистов C#
Ответить
Anonymous
 ConcurrentDictionary: TryRemove внутри блокировки?

Сообщение Anonymous »

Я считаю, что это работает, я тестировал это с несколькими параллельными потоками (хотя и не полностью на предмет условий гонки и взаимоблокировок):

Код: Выделить всё

public static System.Collections.Concurrent.ConcurrentDictionary dict =
new System.Collections.Concurrent.ConcurrentDictionary();
public static item dump;
...

Код: Выделить всё

foreach (System.Collections.Generic.KeyValuePair x in dict)
{
lock (x.Value)
{
if (x.Value.IsCompleted)
{
dict.TryRemove(x.Key, out dump);
}
}
}
Этот вопрос является своего рода продолжением этого вопроса:

Могу ли я удалить элементы из ConcurrentDictionary изнутри цикл перечисления этого словаря?

И этот вопрос:

Обновление полей значений в ConcurrentDictionary

Обновление полей значений в ConcurrentDictionary

p>

В этом я делаю два «рискованных» маневры:


Удаление значений из ConcurrentDictionary с одновременным перечислением по нему (что вроде бы нормально).< /li>
Блокировка части значения ConcurrentDictionary. Необходимо, поскольку манипулирование полями значения не является потокобезопасным, потокобезопасным является только манипулирование самими значениями ConcurrentDictionary (приведенный выше код представляет собой фрагмент более крупного блока кода, в котором фактически манипулируются полями значений).< /li>


Подробнее здесь: https://stackoverflow.com/questions/308 ... hin-a-lock
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»