2016-06-23 108 views
5

Si consideri il seguente scenario.NET Forza metodo di esecuzione differita

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

in cui più thread accedere a questa variabile attraverso un metodo chiamando

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

dove questo metodo fa alcune operazioni pesanti di peso per recuperare i dati

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

Il mio problema qui è che se uso GetorAdd il HeavyDataLoadMethod viene eseguito anche se non è necessario.

Mi chiedevo se c'è un modo per sfruttare l'esecuzione posticipata in questo caso e rendere il HeavyDataLoadMethod rinviato in modo che non venga eseguito finché non è realmente necessario.

(Sì, so che questo è semplice come controllare con un ContainsKey e non pensarci più, ma sono curioso di questo approccio)

risposta

4

È possibile passare un delegato, al posto della chiamata di funzione diretta:

o passare:

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

o

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

Grazie per sottolineare il sovraccarico del metodo, solo ciò che è necessario –