2016-10-17 3 views
2

私が開始したスレッドは、アプリケーションプールがリサイクルまたは停止したとき、またはプロセスが終了したときに強制終了されます。また、IISは長時間実行されるタスク用に設計されたものではないことも知っています。アプリケーションプールがまだ実行中のときに、実行中のスレッドを終了させるかどうかを指定します。

は、プロセスとアプリケーションプールがどのような方法でシャットダウンされていないことを考えるとGlobal.asaxの

protected void Application_Start(object sender, EventArgs e) 
{ 
    _worker = new Thread(Run); 
    _worker.IsBackground = true; 
    _worker.Start(); 
} 

private void Run() 
{ 
    while(true) 
    { 
     Thread.Sleep(50000); 

     WorkWork.BeHappyTo(); 
    } 
} 

に次のように考えてみて、私の_workerスレッドを終了、依然として継続できIIS内の他のメカニズムがありますあたかも何も起こっていないかのように、新しい要求に応えますか?

リクエスト、CPU時間、時計時刻などに関係しないスレッドを監視し、ヒューリスティックのセットに基づいてそれらを終了するメカニズムを探しています。

答えて

2

いいえ、あなたのスレッドは、アプリドメインが存続する限り安全です。あなたのアプリケーションのランダムな部分を終了することは、Webフレームワークのための良い設計ではありません。実際、すべてのスレッドを列挙する.NET APIはありません(神に感謝します)。

エラーがスレッドを終了させるため、エラーを処理する必要があります。通常、ログに記録して継続するのが適切な方法です。ログは参照する必要があります。

私は、アプリケーションの外で時間ベースのスケジューリングを行う方がより安全で簡単なパターンであることがわかりました。 5秒ごとにcronコールを秘密のURLにします。

関連する問題