我在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等待我的线程完成执行,然后开始清除会话变量?
感谢
当它回收应用程序池时,ASP.NET将终止所有线程。不确定ASP.NET是否在背景和前景线程之间有明确的区别(尽管你可能发明了一个,具有足够的创造力)。 – 2012-07-12 21:39:49