2012-07-12 77 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

相關問題