2016-06-23 14 views
5

Rozważmy następujący scenariuszmetoda .NET Siła odroczyć wykonanie

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

gdzie wielu wątków dostęp do tej zmiennej za pomocą metody wywołującego

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

gdzie metoda ta ma pewne operacje waga ciężka do pobierania danych

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

Mój problem polega na tym, że jeśli używam GetorAddHeavyDataLoadMethod zostaje wykonany, nawet jeśli nie jest potrzebny.

Zastanawiam się, czy jest jakiś sposób, aby skorzystać z odroczonego wykonania w tym przypadku i sprawić, że HeavyDataLoadMethod zostanie odroczony, więc nie zostanie wykonany, dopóki nie będzie naprawdę potrzebny.

(Tak, wiem, że to jest tak proste, jak sprawdzanie z containsKey i zapomnieć o nim, ale jestem ciekaw tego podejścia)

Odpowiedz

4

można przekazać delegata, zamiast bezpośredniego wywołania funkcji:

albo przechodzą w:

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

lub

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

That way you pass in the pointer to the method, instead of the method results. Your heavy data load method must accept a parameter with the value of "key".

+0

Dzięki za wskazanie przeciążenia metody, wystarczy to, co jest potrzebne –

Powiązane problemy