Как атомарно обновить значение в ConcurrentDictionary по ключу, только если оно существуетC#

Место общения программистов C#
Ответить
Anonymous
 Как атомарно обновить значение в ConcurrentDictionary по ключу, только если оно существует

Сообщение Anonymous »

Метод ConcurrentDictionary.TryUpdate требует сравнениеValue, которое сравнивается со значением элемента, имеющего указанный ключ.
Но если я попытаюсь сделать что-то вроде этого:

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

if (!_store.TryGetValue(book.Id, out Book existing))
{
throw new KeyNotFoundException();
}

if (!_store.TryUpdate(book.Id, book, existing))
{
throw new Exception("Unable to update the book");
}
когда несколько потоков одновременно обновляют одну книгу, выдается исключение, поскольку существующая книга была изменена в другом потоке.

Я не могу использовать индексатор, потому что он добавляет книгу, если она не существует, и я не могу проверить существование ключа, потому что он также не будет атомарным.

Мой код был изменен следующим образом:

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

while (true)
{
if (!_store.TryGetValue(book.Id, out Book existing))
{
throw new KeyNotFoundException();
}

if (_store.TryUpdate(book.Id, book, existing))
{
break;
}
}
но меня беспокоит бесконечный цикл.

Но если я буду использовать блокировку при обновлении и удалении методы, я потеряю преимущество использования ConcurrentDictionary.

Как правильно решить мою проблему?

Подробнее здесь: https://stackoverflow.com/questions/527 ... f-it-exist
Ответить

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

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

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

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

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