2012-03-04 33 views
3

什麼,我有以下的多線程程序:發生在主線程在這種情況下

class Program{ 
    static void main(){ 
    (new Thread(DoSomething)).Start(); 
    } 
    static void DoSomething(){ 
    // Dome something here... 
    } 
} 

幾個問題:

  1. 是否分拆的子線程後,主線程退出?
  2. 如果它退出並且子線程是後臺線程:主進程是退出還是等待後臺線程完成?
+1

添加'Console.Write'並親自查看 – 2012-03-04 15:13:42

+0

問題#2有點多餘。你首先詢問它是否會退出,然後詢問是否退出:「退出」還是「等待」?那麼如果它退出,那麼它就退出了。 – jlafay 2012-03-04 15:20:51

+0

@jlafay子線程是否是後臺線程是有區別的:)因此問題 – GETah 2012-03-04 15:22:47

回答

6

通常,如果您想等待子線程完成,那麼您需要添加一個x.Join();行(其中x是您的線程的變量),無論您希望主線程停止並等待孩子完成。

編輯:所以,是的,主線程將退出,除非以下三種情況之一發生: 一)產生的線程的主線程代碼的其餘部分之前完成(如果你添加任何)

b)你有一個等待線程完成的條件(例如我提到的Join語句,但也有其他方法)。

c)主線程進入半無限循環(如遊戲/圖形引擎)。

在您的裸機示例中,它肯定會退出(給出您的問題參數,後臺線程)。編輯2:對不起,我似乎躲過了你的第二個問題(實際上只考慮整個背景線程)。如果它是一個後臺線程,它會按照我的解釋退出,如果它是前臺,那麼它不應該(儘管我對前臺線程沒有太多經驗,所以我不能肯定地說)。

所以要回答你的問題:是的,主線程退出。是的,如果孩子特別是後臺線程,該過程也將退出。

編輯3:最終編輯,我保證。我只是想添加一些代碼,讓你可以證明自己的答案(這總是很高興能夠做到):

static void Main(string[] args) 
{ 
    Thread thready = new Thread(DoSomething); 
    thready.IsBackground = true; 
    thready.Start(); 
} 

static void DoSomething() 
{ 
    while (true) 
    { 
     Console.Write("thread's looping \n"); 
    } 
} 

通過翻轉thready.IsBackground = true;thready.IsBackground = false;你一直運行的程序(未退出直到線程)。將它保留爲true將很快退出。 「

1

主要處理線程肯定會退出...

編輯:我複查的文檔,發現財產的IsBackground默認情況下...這意味着主線程將等待是假的......較早響應ws關於第二個問題

+0

爲什麼?它將被自動創建爲前臺線程,這將最終導致父/主線程等待其完成工作。 – MoonKnight 2012-03-04 15:34:22

5

」默認情況下,顯式創建的線程是前景線程。前景線程只要其中任何一個正在運行就保持活動狀態,而後臺線程不會。任何後臺線程仍在運行的突然終止。

class PriorityTest 
{ 
    static void Main (string[] args) 
    { 
     Thread worker = new Thread (() => Console.ReadLine()); 
     if (args.Length > 0) worker.IsBackground = true; 
     worker.Start(); 
    } 
} 

如果該計劃被稱爲不帶任何參數,工作線程將採取前臺狀態,而會等待readline的語句將用戶按Enter鍵。同時,主線程退出,但應用程序繼續運行,因爲前臺線程仍處於活動狀態。

然而,如果參數被傳遞給主()時,工人被分配背景狀態,並且該程序幾乎立即退出主線程結束(終止的ReadLine和程序)。」

參見Joseph Albahri's (a genius and great guy) page關於線程的更多信息(這是這個地方從提取)。

5

取決於Thread.IsBackground

過程中不會退出之前的所有前臺線程結束。在下面的例子...

class Program { 

    static void Main(string[] args) { 
     (new Thread(DoSomething)).Start(); 
    } 

    static void DoSomething() { 
     Thread.Sleep(5000); 
    } 

} 

...該過程將在5秒後退出。

但在這個例子中...

class Program { 

    static void Main(string[] args) { 
     (new Thread(DoSomething) { IsBackground = true }).Start(); 
    } 

    static void DoSomething() { 
     Thread.Sleep(5000); 
    } 

} 

...進程將退出(幾乎)立即。對仍在運行的子後臺線程的影響類似於強行終止進程,因此儘可能避免這樣做。

相關問題