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;
}
}
私のコードからわかるように、私はそれを正確に行いました。コンストラクタは、値を新しいオブジェクト()に初期化します。 – tocqueville
これが問題です。新しいインスタンスごとに、静的オブジェクトの値を変更します。そのコードをコンストラクタから合計で削除します。私はそれを持っているので、宣言だけを残す。 – kagelos
完了しましたが、問題は残ります。私の更新された質問。多分ロックは答えではないでしょう。問題は別の場所にある可能性があります。 – tocqueville