我有一个方法UserPropertyRepository.Get(),我只想为每个网络请求调用一次。
目前我将服务的结果存储在HttpContext.Current.Items集合中,但由于服务可能需要一些时间才能完成,因此我们经常会在结果存储在HttpContext中之前多次调用该服务。 Current.Items集合。如何根据请求锁定对服务的访问?
我的代码目前看起来像这样:
if (HttpContext.Current.Items[FavoriteGameRequestCacheKey] != null)
return (IDictionary<ID, FavoriteGame>)HttpContext.Current.Items[FavoriteGameRequestCacheKey];
var favoriteGames = UserPropertyRepository.Get(FavoriteGameUserPropertyKey);
HttpContext.Current.Session[FavoriteGameRequestCacheKey] = favoriteGames
答案 0 :(得分:1)
通过存储Lazy<T>
,您可以确保初始化数据的比赛不会导致初始化代码多次运行。
所以:
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;