2017-03-27 129 views
0

我熟悉任務和線程,我已經知道this任務壽命兒童vs家長

這裏是我的代碼:

static void Main(string[] args) 
{ 
    var t = Task.Factory.StartNew(() => { 

     Thread.Sleep(3000); 
     Console.WriteLine("Child"); 

    }, CancellationToken.None, TaskCreationOptions.AttachedToParent, TaskScheduler.Default); 

    Task.WaitAll(t); 
    Console.WriteLine("Parent"); 
} 

是否Console.WriteLine("Child");得到所謂regardelss的Task.WaitAll(t);換句話說電話:是否有執行所有不waiting啓動子任務他們(和不盡快殺死爲父方式完成執行)?

回答

2

只要沒有運行前臺線程,C#程序就會終止。 Task.Factory.StartNew使用線程池線程來完成它的工作,並且線程池線程都是後臺線程,而不是前臺線程,因此不會阻止整個程序終止。

如果您想確保整個程序不會終止,您需要確保您至少有一個前臺線程正在運行,這意味着您在創建的Task中執行的額外工作可以在前景線程,而不是後臺線程(如果您希望該工作阻止應用程序終止,那麼這是適當的),或者它意味着等待您的一個現有前臺線程完成其他任務。

+0

如果我使用線程並設置'thread.IsBackground = false;'? – Emaborsa

+0

@Emaborsa你絕對不應該這樣做的線程池線程。它是專門爲後臺線程設計的,你不應該打亂它;它很可能最終導致問題。如果你正在創建自己的新線程,那麼默認情況下它們將成爲前臺線程。 – Servy