2011-01-06 12 views
0

私は、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(); 
} 

ありがとう!

答えて

1

適切な時間は上にあるApplication_End

今、あなたはあなたのバックグラウンドジョブを通知した後、あなたは最後までその時点で彼らのために待機しなければならない、とは、あなたが行うようだとして、その後、続けてみましょう。

私の中には、待っている時間を置いておくのは良いですか、それ以外の場合はプールに問題やシャットダウンがある可能性があります。その後、最大待機時間にプール設定をチェックする必要がありますプールには、待機時間よりも大きな値が設定されているか、無効になっているだけです。

プールガーデン(1つ以上のワーキングプール)がある場合、Application_Endはプールごとに1回呼び出されます。

同じ方法で私のサイトに同じテクニックを使用しています。同じ方法でスレッドに信号を送るのと同じ方法で、最後のログをログに記録し、最後のタイミングを確認してルーチンを強制的に停止しますそれらを何度も走らせてはいけません。 Application_Endは、プールをリサイクルするとき、またはapp_offline.htmファイルを開くとき、またはWebサービスを閉じるときに呼び出されます。個人的に私はリサイクルを無効にしました。私はそれらを必要とせず、更新を行うときにのみapp_offline.htmを開きます。その瞬間、私は自分の仕事を止めるためにプールスレッドを待ちます。

+0

ありがとうアリストス、アプリケーションプールの "シャットダウン時間制限"プロパティは、私が知る必要があったものでした。 (つまり、私の場合は90秒という時間内にシャットダウンしていなければ、プロセスは終了します)。あなたのためのフォローアップの質問、それは実際には、私はApplication_Endを持っている必要があります労働者のジョブをクリーンアップし、戻る前に完了するまで?または、私はそれだけで作業者にBEGINクリーンアップを知らせることができ、その時点でApplication_Endリターンを得ることができますか? – eoldre

+0

@eoldreはい、待つ必要があります、またはスレッドを終了します。 Application_Endの終了時に、ワーキングプールが強制終了され、すべてのスレッドがなくなります。 DllやWeb上のページを変更して更新すると同じことが起こります。 – Aristos

関連する問題