重新启动AppDomain时,前台线程没有阻止应用程序

时间:2012-07-12 20:53:18

标签: c# asp.net multithreading

我在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"]并打印出“我在这里!”,所以我知道我的应用程序没有等待我的线程。

我是否误解了前台线程应该如何工作? AppDomain是否应该重新启动,等待我的线程在它开始之前完成执行并开始清除会话变量?

由于

1 个答案:

答案 0 :(得分:4)

请注意声明“应用程序在其所有前台线程终止之前无法终止”中的“application”一词。如果回收,申请不会终止。在回收期间,ASP.NET正在卸载旧的AppDomain并加载新的AppDomain。一切都在单一过程中完成。流程未终止。在AppDomain卸载范围内,所有线程(Background和Foreground)都被终止。 因此,ASP.NET不会在回收期间等待前台线程完成。 尝试使用简单的控制台应用程序,在其Main方法中创建Foreground线程。它将一直有效,直到线程终止。