優雅ASP.Netアプリケーションを終了Application_Endし、バックグラウンドプロセス、
-
26-09-2019 - |
質問
私はThreadPool.QueueUserWorkItemを使用して、いくつかの背景労働者()オフ発射ASP.Netアプリケーションを有しています。時間のほとんどは、実行中のゼロバックグラウンドスレッドがあるだろう、しかし、それはoccationally時点で実行5-6にそこまでのことができている可能性があります。また、ほとんどが数秒以内に完了しますが、彼らは限り10分程度のために実行可能性があります。
ASP.Netアプリケーションのシャットダウンを引き起こす可能性があるすべての異なるシナリオを考える、私は、アプリケーションのシャットダウンする必要があり、彼らは、処理の途中であるときに優雅に可能な場合は、これらのバックグラウンドプロセスの終了を持っているしたいと思います。
私はあまり早く自分の仕事を停止し、アプリケーションがシャットダウンされていることをコールを取得してから数秒以内にクリーンアップするプロセスを通知する方法を作成する問題を持つ予定はありません。誰もがこの上の具体的なアドバイスを持っている場合が、私は確かにそれをいただければと思います。
私の二つの主な質問があります:
物事をラップする背景の労働者に伝えるための適切な時間になります1)。 Application_End中に?廃棄()?それとも第三の選択肢は、私は認識していないよ。
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();
}
ありがとうございます。
解決
適切な時間はのApplication_End の
でありますそのあなたがやるようだとして、今、あなたはあなたのバックグラウンドジョブを通知した後、あなたは最後までその時点で彼らのために待機しなければならない、として続行しましょう。
これまでか、他のためのあなたのプールを待っていない、待ち時間に時間を置くのに良いです。持っている鉱山では、問題、またはシャットダウンを有していてもよく、その後はプールのシャットダウンに最大待ち時間であなたのプールの設定をチェックする必要があります、そこにあなたの待ち時間よりも大きな値を設定し、またはそれを無効にします。
また、あなたは、プールガーデン、(1つの以上の作業プールを)持っているならば、Application_Endは各プールに1回呼び出されること鉱山で持っています。
私は、私のサイト上で、私は同じように停止するように私のスレッドを知らせる同じように同じ技術を使用して、私はまた、最終的な終わりを記録し、それらが最終終了しているときチェックし、また、私は停止するように私のルーチンを強制し、彼らは多くの時間のために実行させません。 Application_Endは、プールのリサイクルで呼び出されるか、またはあなたがapp_offline.htmファイルを開いたとき、またはWebサービスを閉じるために行くとき。個人的に私は、リサイクルを無効にする必要があり、私はそれらを必要としないと、私は更新を行うとき、私は唯一のapp_offline.htmを開きます。その瞬間、私は自分の仕事を停止するには、私のプールスレッドを待っています。