1

リモートデータベースでクエリが非常に遅いaspnetWebサイトがあります。この問題に対処するために、Application_Startでキャッシュを使用します。

HttpRuntime.Cache["Folders"] = (from f in db.Folders select f).ToList();

コントローラーで

var folderList = (List<Folder>)HttpRuntime.Cache["Folders"];

Webサイトを最初にロードするのにかなりの時間がかかりますが、起動すると高速になります。また、IISの新しいserverAutoStart = "true"機能を使用して、キャッシュがロードされた状態でWebサイトが常に実行されているようにします。アプリケーションプールを再起動した場合でも、IISは新しいW3wpプロセスでWebサイトを読み込み、新しいインスタンスが読み込まれたときにプロセスを切り替えます。ダウンタイムが発生しないか、起動が遅くなります。

しかし、コントローラーのアクションが発生したときにキャッシュをリロードしたいと思います。それで、リロード中にアクションをトリガーしたすべてのWebサイトまたはセッションをブロックせずに非同期でリロードすることは可能ですか?また、操作中も現在のCache["Folders"]が機能するようにしたいと思います。

4

1 に答える 1

1

並列タスクを利用できます

   var repopulateCache = new System.Action(() => RepopulateCache(someParameter);
   Task.Factory.StartNew(repopulateCache);

これを使用する前に、何をしているのかを知っておくことをお勧めします。いくつかの背景情報を読んでみてください。

とは言うものの、私はこれをしばらくの間本番環境で使用してきましたが、非常にうまく機能し、通常のスレッドの危険性について(あまり)心配する必要がないことを意味します。それはあなたのウェブサーバー上でバックグラウンド作業を作成しますが、あなたの場合、それは大きなリスクのようには聞こえません。

于 2012-11-08T11:05:43.043 に答える