Параллельный словарь AddOrUpdate vs Index Add
Есть два способа присвоить значения существующему ключу в параллельном словаре в моем текущем проекте.
а. concurrentDictionary1[key] = value
;
и
В. concurrentDictionary2.AddOrUpdate(key, value, (k, v) => value);
Если я знаю, что существует "ключ", являются ли они функционально эквивалентными?
Является ли защита, предлагаемая concurrency параллельного словаря, минуя метод "A"?
В чем тут разница? Каковы причины выбора одного из них?
Я просмотрел документацию в msdn, и кажется, что они только инициализируют параллельный словарь с помощью метода "A", а не обновляют его.
Ответы
Ответ 1
Они оба называют TryAddInternal
, поэтому ведут себя точно так же **.
Update:
Есть еще одна разница. Здесь код от индексатора:
set
{
TValue tValue;
if (key == null)
{
throw new ArgumentNullException("key");
}
this.TryAddInternal(key, value, true, true, out tValue);
}
против. из метода
while (!this.TryAddInternal(key, tValue, false, true, out tValue1));
Итак, похоже, есть вероятность, что индекеры будут терпеть неудачу молча, тогда как метод будет продолжать попытки, пока это не удастся. Хм, потребуется более глубокий анализ, чтобы полностью понять различия между ними:/
Декомпиляторы все еще твой друг.
** Я понял.
Ответ 2
Это старый вопрос, но никто не ответил, почему вы будете использовать один над другим.
Выберите A (индекс), если вы хотите добавить или обновить, и обновление не зависит от существующего значения.
Выберите B (AddOrUpdate), если вы хотите добавить или обновить, а обновление зависит от существующего значения. AddOrUpdate будет выполнять обновление атомарно.
Итак, в случае в вопросе вы хотите использовать индекс. Это проще, легче читать и, вероятно, быстрее, так как вы не создаете анонимную функцию.
Ответ 3
Если я знаю, что существует "ключ", являются ли они функционально эквивалентными?
Как вы его используете, да. Фактически, они эквивалентны, существует ли key
.
В чем причины выбора одного из них?
AddOrUpdate
принимает функцию, которая будет использоваться для обновления значения. Вы просто используете его для установки значения напрямую, но оно предназначено для одновременного обновления значения в зависимости от результата функции. Например:
concurrentDictionary2.AddOrUpdate(key, value, (k, v) => v + value); // adds value to the existing value
Ответ 4
Да эквивалент.
Нет. Индексаторы - это фактически методы (например, свойства), и я не думаю, что они обходят concurrency для этого.
Метод