このシナリオをしっかりと理解したいので、この投稿を正当な StackOverflow の質問に形作りたいと思っていますが、それがあまりにもローカライズされているか、「意見」と見なされているかどうかは間違いなくわかります。
これが私のシナリオです: Web アプリをロードするとき、データベースから大量のデータをロードしてキャッシュします。問題は、このプロセスに約 10 ~ 15 秒かかり、Web サーバーの最初の起動時に遅延が生じることです。これは開発中はちょっと厄介で、実稼働環境で Web サーバーをバウンスするときにいくつかの問題が発生します (これは新しいサイトなので、小さなバグを見つけたら修正したり、IIS の設定をいじったりすることがよくあります)。
私は疑問に思いました - アプリケーションの開始時にこの作業を新しいスレッドにオフロードし、他のユーザーがサイトを使用しているときにバックグラウンドでこれを実行できますか? 明らかに、サイトがロードされたときに特定の機能が約 10 ~ 15 秒間動作しませんでしたが、データが利用可能になるまで、その状態を処理またはブロックできます。最初はノーと思っていました。Web サーバーは、要求が終了した場合にこれらのスレッドを終了するか、これらのスレッドが終了するまでブロックしようとしていました。この理論をテストするために、小さなテスト アプリを作成することにしました。
public class Global : System.Web.HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
Thread thread = new Thread(LoadData);
thread.Start();
}
private void LoadData()
{
for (int i = 0; i < 100; i++)
{
Trace.WriteLine("Counter: " + i.ToString());
Thread.Sleep(1000);
}
}
}
アプリが起動したら、新しいスレッドを起動し、それを 100 までカウントします。驚いたことに、すぐにホーム ページに移動し、Visual Studio のデバッグ出力ウィンドウで、数値が増加するのを確認できました。私は実際にこれが機能することに驚きました。
私の質問:
まず、これを行う際に落とし穴はありますか? それはトラブルを求めていて、何かが爆発しようとしていますか? おそらく異なるスレッド モデルを使用しているため、この動作は Web サーバーまたは IIS のバージョン間で変化しますか? このデザインに関する全体的なフィードバックを探しています。