Подтвердить что ты не робот

Параллельный словарь AddOrUpdate vs Index Add

Есть два способа присвоить значения существующему ключу в параллельном словаре в моем текущем проекте.

а. concurrentDictionary1[key] = value;

и

В. concurrentDictionary2.AddOrUpdate(key, value, (k, v) => value);

Если я знаю, что существует "ключ", являются ли они функционально эквивалентными?

Является ли защита, предлагаемая concurrency параллельного словаря, минуя метод "A"?

В чем тут разница? Каковы причины выбора одного из них?

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

4b9b3361

Ответ 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 для этого. Метод