2016-04-06 31 views
0

Kullanıcı isteğim, Web isteği başına yalnızca bir kez aramak istediğim UserPropertyRepository.Get() yöntemim var.C# İstek başına yönteme erişimi kilitle

Şu anda hizmetin sonucunu HttpContext.Current.Items koleksiyonunda saklıyorum, ancak hizmetin tamamlanması biraz zaman alabildiğinden, genellikle HttpContext dosyasında saklanmadan önce hizmetin birden çok kez çağrıldığını yaşıyoruz .Current.Items koleksiyonu. İstek başına hizmete erişimi nasıl kilitlerim?

Benim Kod şu anda şuna benzer:

if (HttpContext.Current.Items[FavoriteGameRequestCacheKey] != null) 
    return (IDictionary<ID, FavoriteGame>)HttpContext.Current.Items[FavoriteGameRequestCacheKey]; 

var favoriteGames = UserPropertyRepository.Get(FavoriteGameUserPropertyKey); 

HttpContext.Current.Session[FavoriteGameRequestCacheKey] = favoriteGames 
+1

yerine veri depolama, benzer şekilde, verilere yol açan ya da 'Görevi ' Bir 'Lazy ' saklayın. – spender

+0

@spender buna bir örnek verebilir misiniz? – pwind

+0

Elbette. Size bu konuda bir cevap yazdım ... – spender

cevap

0

bir Lazy<T> depolayarak, ırklar veri birden fazla kez çalıştırılan başlatma kodu sonuçlanmayan başlatmak için emin olabilirsiniz. Yani

:

if(myCache[cacheKey] == null) 
{ 
    myCache[cacheKey] = new Lazy<IDictionary<ID, FavoriteGame>>(
     //initialisation only occurs when accessing Value property of Lazy, 
     //so this assignment happens very quickly. Caveat, it's still 
     //not atomic (i.e. you might get a context change after the null 
     //check, but before the assignment.) 
     () => UserPropertyRepository.Get(FavoriteGameUserPropertyKey), 
     true //thread-safe 
    ); 
} 
return myCache[cacheKey].Value; 
+0

Çok teşekkürler @spender, sadece ihtiyacım olan şey bu. – pwind

+0

@pwind: Benzer şekilde, başlatmanız eşzamansız ise, tamamlanmamış bir "Görev " veya hatta bir "Lazy >" saklayabilirsiniz. – spender