Я профилировал свое приложение и провел несколько тестов производительности, которые заставили меня поверить, что следующая схема if-lock-if:
private float GetValue(int id)
{
float value;
if (!dictionary.TryGetValue(id, out value))
{
lock (lockObj)
{
if (!dictionary.TryGetValue(id, out value))
{
value = ComputeValue(id);
dictionary.Add(id, value);
}
}
}
}
, кажется, работает быстрее, чем "lock-if" или использованиеReaderWriterLockSlim.Но очень редко я получаю следующее исключение:
1) Exception Information
*********************************************
Exception Type: System.NullReferenceException
Message: Object reference not set to an instance of an object.
Data: System.Collections.ListDictionaryInternal
TargetSite: Int32 FindEntry(TKey)
HelpLink: NULL
Source: mscorlib
StackTrace Information
*********************************************
at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
at MyNamespace.GetValue()
.....
.....
Что я здесь не так делаю?
Редактировать: чтобы уточнить, этот метод вызывается в среднем более 50 миллионов раз, иконфликт обычно меньше 5000.
Спасибо