3

MSDN で、フォアグラウンド スレッドとバックグラウンド スレッドの違いは、フォアグラウンド スレッドがすべて終了するまでアプリケーションを終了できないのに対し、バックグラウンド スレッドを待つ必要がないことです。スレッドの理解を深めるために、これを試してみることにしました。

Thread t = new Thread(Work);  //Work() just has the thread sleep for a long time
t.IsBackground = false; //make it a foreground thread
t.Start();
while(true)
{
    if(Session["checker"] != null)
    {
        Session["checker"] = true;
        System.Diagnostics.Debug.Write("I'm here!");
    }
}

セッション変数を使用して、AppDomain の再起動時にセッションがクリアされるため、AppDomain が再起動されたかどうかを確認しました。

したがって、web.config ファイルを保存すると、AppDomain の再起動がトリガーされます。これには、フォアグラウンドで実行されているtため、実行時間の長いスレッドを待機する必要があります。tただし、web.config ファイルに触れると、すぐにクリアさSession["checker"]れて「I'm here!」と出力されるため、アプリケーションがスレッドを待機していないことがわかります。

フォアグラウンド スレッドがどのように機能するかを誤解していますか? AppDomain の再起動は、スレッドが実行を終了してからセッション変数のクリアを開始するのを待つべきではありませんか?

ありがとう

4

1 に答える 1

4

「フォアグラウンド スレッドがすべて終了するまで、アプリケーションは終了できません」という文の「アプリケーション」という言葉に注意してください。リサイクルの場合、申請は終了しません。リサイクル中、ASP.NET は古い AppDomain をアンロードし、新しい AppDomain をロードしています。すべてが単一のプロセス内で行われます。プロセスは終了していません。AppDomain のアンロードの範囲内で、すべてのスレッド (バックグラウンドとフォアグラウンド) が強制終了されます。したがって、ASP.NET は、リサイクル中にフォアグラウンド スレッドが完了するのを待ちません。Main メソッドでフォアグラウンド スレッドを作成する単純なコンソール アプリケーションを試してください。スレッドが終了するまで機能します。

于 2012-07-12T21:37:40.650 に答える