2016-05-21 4 views
0

を失敗した私は、クエリの結果をキャッシュするために、以下のサービスメソッドを使用しています:特定のページでMVC 5 2つのスレッドで打ったときHttpContext.Current.Cache方法が同時に

private readonly CoreDbContext _dbContext; 

    public EcommerceProductService() 
    { 
     _dbContext = GetDbContext(); 
    } 

    public IEnumerable<EcommerceProduct> GetAllCached() 
    { 
     var cachedResult = HttpContext.Current.Cache["EcommerceProductService.GetAllCached"] as IEnumerable<EcommerceProduct>; 

     if (cachedResult == null) 
     { 
      var result = _dbContext.EcommerceProducts.ToList(); 

      HttpContext.Current.Cache.Insert("EcommerceProductService.GetAllCached", result); 

      return result; 
     } 

     return cachedResult; 
    } 

をこのメソッドは2つのスレッドで同時に呼び出されます(なぜなら、製品のコレクション全体を2回表示する必要があるが、フィルタは異なるからです)。

奇妙にも、初めてアプリケーションを起動すると、スレッドのうちの1つだけが「勝ち」、製品のリストを受け取る一方、もう1つはnullを受け取ります。ページをリフレッシュすると、両方とも正常に動作します(その時点でキャッシュから結果がフェッチされるため)が、どちらか一方しか初めてではありませんが、どちらも動作しません。

また、私はLockステートメントでコード全体をラップしようとしましたが、何も変わりませんでした。私は何が欠けていますか?あなたは今それを持っていたよう

private readonly CoreDbContext _dbContext; 
    private static readonly object Locker = new object(); 

    public EcommerceProductService() 
    { 
     _dbContext = GetDbContext(); 
    } 

    public IEnumerable<EcommerceProduct> GetAllCached() 
    { 
     lock (Locker) 
     { 
      var cachedResult = HttpContext.Current.Cache["EcommerceProductService.GetAllCached"] as IEnumerable<EcommerceProduct>; 

      if (cachedResult == null) 
      { 
       var result = _dbContext.EcommerceProducts.ToList(); 

       HttpContext.Current.Cache.Insert("EcommerceProductService.GetAllCached", result); 

       return result; 
      } 

      return cachedResult; 
     } 

    } 

答えて

0

private static object _locker = new object(); 

にご_locker宣言を変更

EcommerceProductServiceの各インスタンスは無用ロック、レンダリング、それに新しい値を割り当てます。

+0

私のコードからわかるように、私はそれを正確に行いました。コンストラクタは、値を新しいオブジェクト()に初期化します。 – tocqueville

+0

これが問題です。新しいインスタンスごとに、静的オブジェクトの値を変更します。そのコードをコンストラクタから合計で削除します。私はそれを持っているので、宣言だけを残す。 – kagelos

+0

完了しましたが、問題は残ります。私の更新された質問。多分ロックは答えではないでしょう。問題は別の場所にある可能性があります。 – tocqueville

関連する問題