2016-06-23 19 views
5

Aşağıdaki senaryoyu düşünün.NET Kuvvet yöntemi ertelenmiş yürütme

Birden çok iş parçacığı bu yöntem veri almak için bazı ağır işlemlerini yapar

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

çağıran bir yöntemle bu değişkeni erişmek

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

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

GetorAddHeavyDataLoadMethod, gerekli olmasa bile çalıştırılır.

Bu durumda ertelenmiş yürütme avantajından yararlanmak için bir yol olup olmadığını ve HeavyDataLoadMethod ertelendi, bu yüzden gerçekten gerekli olana kadar yürütülür değil mi diye merak ediyordum.

(Evet, bu bir containsKey ile kontrol ve unutun kadar basittir biliyorum ama bu yaklaşım merak ediyorum) yerine doğrudan işlev çağrısının, bir temsilci geçebilir

cevap

4

:

ya geçmesi:

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

veya

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

Yöntemin aşırı yüklenmesine dikkat ettiğiniz için, sadece ihtiyaç duyulan şey –