3

属性[OutputCache(Duration=XXX)](およびドーナツ バリアント[DonutOutputCache(Duration=XXX)]) を使用しています。

ただし、( ASP.NET (MVC) Outputcache および同時要求で確認) これはスレッド セーフではないことに気付きました: キャッシュが再生成された場合、コントローラー メソッドが十分に遅い場合 (通常はそうです。これがキャッシュする理由です) ^^)、複数の「同一の」リクエストは、1 つのリクエストのみを処理して他のリクエストをブロックし、キャッシュから提供するのではなく、アクションに入って操作を実行できます。

OutputCacheブロック/スレッドセーフ属性を簡単に作成する方法はありますか? DonutOutputCache?に対する同じ質問 いいね[BlockingOutputCache(SameParameters)][BlockingDonutOutputCache(SameParameters)]

注: キャッシュされたアクションは通常のアクションであり、 を返しますView(model)。重い作業はアクションとビューで実行されます (ビューは @Model.GetPrice() のような非常に単純なことを実行できますが、これはバックエンドでの重い作業に変換されます)。

ありがとう!

編集: 別の方法は[BlockingAction(BlockingParameters)]、キャッシュから提供されない場合に、このアクションへの後続のリクエストをブロックする属性を作成することです。

4

1 に答える 1

1

VaryByCustom を使用できます。Global.asax で GetVaryByCustomString メソッドをオーバーライドします。次に、一意のキャッシュ キーを作成し、キャッシュ ストレージでダブル チェック ロックを使用します。シンクロ方式です。キャッシュの解決を開始してからキャッシュの解決を終了すると、非同期の方法が存在すると推測できます。

于 2013-10-18T15:16:26.950 に答える