Отложенное выполнение метода .NET Force

Рассмотрим следующий сценарий

private static ConcurrentDictionary<string, ConcurrentDictionary<string, string>> CachedData;

где несколько потоков получают доступ к этой переменной через вызов метода

ConcurrentDictionary<string, string> dic = CachedData.GetorAdd(key, HeavyDataLoadMethod())

где этот метод выполняет некоторые тяжелые операции для извлечения данных

private ConcurrentDictionary<string, string> HeavyDataLoadMethod()
{
        var data = new ConcurrentDictionary<string,string>(SomeLoad());
        foreach ( var item in OtherLoad())
           //Operations on data
        return data;
}

Моя проблема в том, что если я используюGetorAdd, то HeavyDataLoadMethodвыполняется, даже если это не нужно.

Мне было интересно, есть ли способ воспользоваться отложенным выполнением в этом случае и сделать HeavyDataLoadMethoddeferred, чтобы он не выполнялся до тех пор, пока он действительно не понадобится.

(Да, я знаю, что это так же просто, как проверить с помощью ContainsKey и забыть об этом, но мне любопытен этот подход)


person Miguel A. Arilla    schedule 23.06.2016    source источник


Ответы (1)


Вы можете передать делегат вместо прямого вызова функции:

Либо пройти:

// notice removal of the `()` from the call to pass a delegate instead 
// of the result.
ConcurrentDictionary<string, string> dic = CachedData.GetorAdd(key, HeavyDataLoadMethod)

or

ConcurrentDictionary<string, string> dic = CachedData.GetorAdd(key, 
    (key) => HeavyDataLoadMethod())

Таким образом вы передаете указатель на метод вместо результатов метода. Ваш метод интенсивной загрузки данных должен принимать параметр со значением «ключ».

person jessehouwing    schedule 23.06.2016
comment
Спасибо за указание на перегрузку метода, как раз то, что нужно - person Miguel A. Arilla; 23.06.2016