Я пытаюсь обновить записи в ConcurrentDictionary примерно так:
class Class1
{
public int Counter { get; set; }
}
class Test
{
private ConcurrentDictionary<int, Class1> dict =
new ConcurrentDictionary<int, Class1>();
public void TestIt()
{
foreach (var foo in dict)
{
foo.Value.Counter = foo.Value.Counter + 1; // Simplified example
}
}
}
По существу мне нужно перебирать словарь и обновлять поле для каждого значения. Из документации я понимаю, что мне нужно избегать использования свойства Value. Вместо этого я думаю, что мне нужно использовать TryUpdate, за исключением того, что я не хочу заменять весь свой объект. Вместо этого я хочу обновить поле объекта.
После чтения этой записи в блоге в блоге команды PFX: Возможно, мне нужно использовать AddOrUpdate и просто ничего не делать в делетете добавления.
Есть ли у кого-нибудь представление о том, как это сделать?
У меня есть десятки тысяч объектов в словаре, которые мне нужно обновлять каждые тридцать секунд. Создание новых, чтобы обновить свойство, вероятно, невозможно. Мне нужно клонировать существующий объект, обновлять его и заменять в словаре. Id также необходимо заблокировать его на время цикла клонирования/добавления. Тьфу.
Какой идентификатор нравится делать, это перебирать объекты и обновлять свойство Counter напрямую, если это возможно.
Мое последнее исследование привело меня к Parallel.ForEach, который звучит великолепно, но он не должен использоваться для действий, которые обновляют состояние.
Я также упомянул о Interlocked.Increment, который звучит великолепно, но мне все же нужно выяснить, как использовать его для каждого элемента в моем словаре в потоковом безопасном режиме.