2016-05-31 76 views
-1

對不起,問這個很愚蠢的問題,但我讓這個程序測試是否所有前景線程都等待在程序終止前完成。.NET應用程序在終止程序之前是否等待所有前景線程完成?

但是在這個程序中,只要我點擊任何鍵退出程序,主線程就會終止,然後關閉應用程序,即使在執行其他前臺線程的過程中也是如此。

using System; 
using System.Threading; 

namespace ForegroundThreads 
{ 
    // This is a program to test whether or not the application 
    // will terminate when there is a pending foreground thread running. 

    // In describing the difference between foreground and background threads, 
    // the documentation states that an application will terminate all 
    // background threads when all foreground threads have finished execution. 
    // This implies that the application will stall the main thread until 
    // all foreground threads have completed execution. Let us see if this 
    // is the case. 

    // Quote: 
    // A managed thread is either a background thread or a foreground thread. 
    // Background threads are identical to foreground threads with one exception: 
    // a background thread does not keep the managed execution environment running. 
    // Once all foreground threads have been stopped in a managed process (where the .exe file is a managed assembly), 
    // the system stops all background threads and shuts down. 
    // Source: https://msdn.microsoft.com/en-us/library/h339syd0%28v=vs.110%29.aspx 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var t = new Thread(() => { 1000000.Times(() => { Console.WriteLine("Hello"); }); }); 
      t.Start(); 

      Console.WriteLine("Press any key to exit the main thread..."); 
      Console.ReadKey(); 
     } 
    } 

    public static class Extensions 
    { 
     public static void Times(this int numTimes, Action action) 
     { 
      for (int i = 0; i < numTimes; i++, action()) ; 
     } 
    } 
} 

我注意到,當我運行此代碼

在我的機器,如果我減少次數,以較小的值,比如,1000行爲,它會立即殺死所有前臺線程時主線程退出。但是,如果我將值設得很大,例如100萬,那麼系統會繼續運行我創建的前臺線程,忽略所有擊鍵,直到完成一百萬次打印。

更新

GSerg掛鉤,要求同樣的事情,另外一個問題。但是,如果你仔細閱讀這個問題,那個問題的海報真的在問:「發生了什麼事?」

答案只是引用MSDN解釋所有前臺線程正在等待。我的問題是爭論的。

我的問題是 - 爲什麼程序等待前景線程有時完成,而在其他時間沒有。因此,在另一個問題中的答案對我沒有任何幫助。

+0

我無法複製。如果我將線程保持爲前景,當按Enter鍵時程序不會終止。如果我將其IsBackground屬性設置爲true,程序會終止。 –

+0

嘗試更改'Times'方法的接收者的值。我正在更新這個問題,並提供更多的細節,以便它等待前景線程完成,以及何時不完成。在我的機器上,如果我將次數減少到一個較小的值,例如1000,它會在主線程退出時立即殺死所有前臺線程。但是,如果我將值設得很大,例如100萬,那麼系統會繼續運行我創建的前臺線程,忽略所有擊鍵,直到完成一百萬次打印。 –

+0

使用Thread.Sleep()而不是Console.Writeline()可能更可靠。 –

回答

0

我的不好,我的眼睛沒有看到20-20。該程序確實等待派生的前景線程完成執行。

發生了什麼事是,當我通過降低Times方法的整數接收機的價值,即使這個程序實際上已經完成打印減少迭代次數所有你好的,它似乎我的眼睛該程序仍在忙於打印。這導致我相信產生的線程仍在運行,當我按下鍵盤上的任何其他鍵時,它立即終止該過程。

相關問題