Обновить ключ в словаре c # (ConcurrentDictionary) - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу добавить метод UpdateKey к наблюдаемому классу-оболочке вокруг ConcurrentDictionary.Примерно так:

private bool UpdateKeyWithNotification(TKey key1, TKey key2)
{
    if (key1.Equals(key2)) return false;
    TValue value;
    var result = _dictionary.TryRemove(key1, out value);
    if (!result) return false;
    result = _dictionary.TryAdd(key2, value);
    if (result) NotifyObserversOfChange();
    return result;
}

Очевидно, что эта операция больше не является атомарной, поскольку она выполняет удаление, а затем добавление.У меня нет особых требований к производительности для UpdateKeyWithNotification, так как он будет использоваться редко, но я хотел бы иметь некоторую гарантию выполнения для поддержки _dictionary между TryRemove и TryAdd.Я мог бы добавить некоторый тип RWMutex или объект блокировки вокруг операций TryRemove и TryAdd.Но это, вероятно, означало бы, что я также должен добавить операторы блокировки ко всем другим методам в классе.Есть ли альтернатива моему решению?

1 Ответ

0 голосов
/ 18 декабря 2018

Вы просто не можете использовать ConcurrentDictionary, чтобы сделать это атомарно с любым из его встроенных методов (и обратите внимание, что свойство SyncRoot не поможет, поскольку оно не поддерживается.

Выможно использовать внешний механизм синхронизации, но тогда вы сразу ничего не получите от ConcurrentDictionary, фактически сделав его менее параллельным.

Поскольку вы по сути повторно вводите некоторые данные, я бы предложил вамполучить потокобезопасную оболочку из DictionaryBase и добавить свой метод specialize.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...