0

ThreadPool.QueueUserWorkItem() を使用して一部のバックグラウンド ワーカーを起動する ASP.Net アプリケーションがあります。ほとんどの場合、実行中のバックグラウンド スレッドはゼロですが、一度に最大 5 ~ 6 個のスレッドが実行される場合もあります。さらに、ほとんどは数秒以内に完了しますが、10 分も実行される可能性があります。

ASP.Net アプリケーションのシャットダウンを引き起こす可能性のあるさまざまなシナリオをすべて考えると、アプリケーションをシャットダウンする必要があり、処理の途中である場合は、可能であればこれらのバックグラウンド プロセスを正常に終了させたいと考えています。

アプリケーションがシャットダウンされているという呼び出しを受け取ってから数秒以内に作業を早期に停止し、クリーンアップするようにプロセスに通知する方法を作成する方法を作成する問題があまり発生しないと思います。誰かがこれについて具体的なアドバイスを持っているなら、私は確かにそれを感謝します.

私の2つの主な質問は次のとおりです。

1) バックグラウンド ワーカーに物事をまとめるように伝えるのに適切な時期はいつですか。Application_End 中? 廃棄()?または、おそらく私が気付いていない 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();
}

ありがとう!

4

1 に答える 1

1

適切な時間はApplication_Endにあります

バックグラウンド ジョブにシグナルを送信したら、その時点でジョブが終了するのを待ってから、続行する必要があります。

私の場合、これは待機にタイムアウトを設定するのに適しています。待機しないと、プールに問題が発生したり、シャットダウンしたりする可能性があります。プールをシャットダウンするには、最大待機時間のプール設定を確認する必要があります。待機よりも大きい値、または無効にしただけです。

また、プール ガーデン (複数の作業プール) がある場合、各プールに対して Application_End が 1 回呼び出されることも確認してください。

私は自分のサイトで同じ手法を使用しています。スレッドに同じ方法で停止するように通知するのと同じ方法です。また、最終終了をログに記録し、それらが最終終了であることを確認します。また、ルーチンを強制的に停止させ、停止させません。何度も走る。Application_End は、プールのリサイクル時、app_offline.htm ファイルを開くとき、または Web サービスを閉じるときに呼び出されます。個人的にはリサイクルを無効にしています。リサイクルは必要ありません。更新するときにのみ app_offline.htm を開きます。その時点で、プール スレッドが作業を停止するのを待ちます。

于 2011-01-06T17:26:14.250 に答える