私は、ThreadPool.QueueUserWorkItem()を使用してバックグラウンドワーカーを起動させるASP.Netアプリケーションを用意しています。たいていの場合、バックグラウンドスレッドは実行されませんが、一度に5〜6回まで実行される可能性があります。さらに、ほとんどの場合、ほんの数秒で完了しますが、10分もかかる可能性があります。Application_Endおよびバックグラウンドプロセス、ASP.Netアプリケーションを正常に終了する
ASP.Netアプリケーションのシャットダウンを引き起こす可能性があるさまざまなシナリオを考えてみると、これらのバックグラウンドプロセスは、アプリケーションをシャットダウンする必要があり処理の途中にあるときに可能な限り正常に終了したいと考えています。
私は、あまりにも多くの問題を抱えて、早すぎる作業を中止し、アプリケーションがシャットダウンされてから数秒以内にクリーンアップするようにプロセスに通知する方法を作成すると予想していません。誰かがこれに関する特定のアドバイスを持っているなら、私は確かにそれを感謝します。
私の二つの主な質問は以下のとおりです。
1)物事をラップする背景の労働者に伝えるための適切な時間になるとき。 Application_Endの間に? Dispose()?あるいは、私が気付いていない3番目の選択肢かもしれません。
2)上記のイベント中にプロセスが終了するのを待ってから戻ると、すぐにApplication_Endを返さないと、バックグラウンドジョブをうまくシャットダウンしない場合があります。
void Application_End(object sender, EventArgs e)
{
//if this for whatever reason takes a non-trivial time to execute, what problems could I encounter?
SignalBackgroundJobsAndWaitForThemToShutDown();
}
ありがとう!
ありがとうアリストス、アプリケーションプールの "シャットダウン時間制限"プロパティは、私が知る必要があったものでした。 (つまり、私の場合は90秒という時間内にシャットダウンしていなければ、プロセスは終了します)。あなたのためのフォローアップの質問、それは実際には、私はApplication_Endを持っている必要があります労働者のジョブをクリーンアップし、戻る前に完了するまで?または、私はそれだけで作業者にBEGINクリーンアップを知らせることができ、その時点でApplication_Endリターンを得ることができますか? – eoldre
@eoldreはい、待つ必要があります、またはスレッドを終了します。 Application_Endの終了時に、ワーキングプールが強制終了され、すべてのスレッドがなくなります。 DllやWeb上のページを変更して更新すると同じことが起こります。 – Aristos