2012-07-12 54 views
3

我在MSDN上读到前景线程和后台线程之间的区别在于,应用程序无法终止,直到它的所有前台线程终止为止,不要等待后台线程。我决定尝试一下,以便更好地理解线程。当我重新启动AppDomain时,前台线程没有阻止应用程序

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等待我的线程完成执行,然后开始清除会话变量?

感谢

+0

当它回收应用程序池时,ASP.NET将终止所有线程。不确定ASP.NET是否在背景和前景线程之间有明确的区别(尽管你可能发明了一个,具有足够的创造力)。 – 2012-07-12 21:39:49

回答

4

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

+0

谢谢拉曼,我曾假设应用程序终止是AppDomain卸载的一部分。我猜这不是:) – hemlocker 2012-07-12 21:59:02

相关问题