C#锁定每个请求的方法访问权限

时间:2016-04-06 09:03:33

标签: c# .net locking

我有一个方法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

1 个答案:

答案 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;