У меня есть несколько случаев, когда я использую ConcurrentDictionary<TKey, TValue>
для кеширования значений, но часто мне нужно выполнить проверку значения, чтобы решить, добавлять ли его в кеш, используя ConcurrentDictionary<TKey, TValue>.GetOrAdd(TKey, Func<TKey, TValue>)
.Как я могу сказать `ConcurrentDictionary.GetOrAdd`, чтобы не добавлять значение?
Обычно вдоль линий:
private readonly ConcurrentDictionary<Type, ISomeObject> someObjectCache =
new ConcurrentDictionary<Type, ISomeObject>();
public ISomeObject CreateSomeObject(Type someType)
{
return someObjectCache.GetOrAdd(someType, type =>
{
if(!Attribute.IsDefined(someType, typeof(SomeAttribute))
// Do something here to avoid the instance from being added to
// `someObjectCache`
ISomeObject someObject;
// Typical factory functionality goes here
return someObject;
});
}
так, как я справиться с этим сегодня бросить исключение, которое, как представляется, отлично работает, но я хотел бы более чистый подход (возможно, флаг можно установить или конкретное значение, которое я могу установить для возвращаемого значения), чтобы отменить GetOrAdd
в пределах лямбда (хотя это можно было бы реально заменить методом полного выдувания).
Основываясь на моем опыте с другими LINQ, как методы, возвращение null
приведет к стоимости получения добавляется без проверки как таковой (и чтение IL для GetOrAdd
он выглядит, как он будет приводить к одной и той же проблемы), так что я не думайте, что это сработает.
Есть ли способ избежать использования исключений для отмены добавления с помощью GetOrAdd
?
Это было бы (и _I have_), но как только вы загромождаете это всеми необходимыми механизмами блокировки нити, оно становится довольно грязным (не то, что моя не требует блокировки ... просто не в той же степени). Я ищу более чистое решение, а не тот, который требует, чтобы вы эффективно сворачивали мою собственную версию 'ConcurrentDictionary'. –
Обновлен мой ответ - GetOrAdd не блокирует часть добавления, только при работе с битами внутреннего массива. Поэтому, как я вижу, вам не нужны никакие блокировки, если вы намерены добавить подтверждение. –
Да, я прочитал эту часть документов, но это все еще не то, что я ищу. Если бы я захотел написать столько кода, я бы сам справился с блокировкой. –