2014-05-04 66 views
0

我碰到一個問題,即使線程在後臺運行時,如果while(true)循環沒有在主方法中運行(沒有線程),應用程序仍會關閉。只有線程的控制檯關閉?

僞例如:

public static void Method1() { 
    while(true) {} 
} 
public static void Method2() { 
    while(true) {} 
} 
public static void main() { 
    Thread myThread1 = new Thread(() => Method1()); 
    Thread myThread2 = new Thread(() => Method2()); 
    myThread1.Start(); 
    myThread2.Start(); 
} 

現在,程序運行時,啓動線程後停止執行,即使正在運行的線程while循環無限。我如何使這個失效?我知道我可以在主要方法中添加一個無限循環,但這看起來很奇怪。

有人建議我使用互斥鎖或semaphone,但是我現在不會從哪裏開始,或者如何將它們應用到我的應用程序。

+0

陌生,它不會退出我。 –

+0

或者您可以使用TPL並對您生成的任務執行[WaitAll()](http://msdn.microsoft.com/en-us/library/dd270695%28v=vs.110%29.aspx)。 – slugster

+1

你爲線程設置了'IsBackground = true'嗎? –

回答

4

我想你應該需要的是線程的IsBackground屬性設置爲false:

http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground%28v=vs.110%29.aspx

+0

來自您的鏈接: 後臺線程與前臺線程完全相同,只是後臺線程不會阻止進程終止。一旦屬於某個進程的所有前臺線程都終止,公共語言運行庫就結束該進程。任何剩餘的後臺線程都會停止並且無法完成。 –

+0

imho,它在回答中很有意義 –

0

是的,你可以使用一個互斥體,見MSDN documentation

在類

private static Mutex mut = new Mutex(); 

而在你的方法使用

mut.WaitOne(); 
mut.ReleaseMutex(); 

主要將退出,但線程將持續到互斥體被釋放

1

當主線程退出時,應用程序退出。這很正常。你可以使用Thread.Join來等待它們結束。

myThread1.Start(); 
myThread2.Start(); 
myThread1.Join(); 
myThread2.Join(); 

編輯:實際上,@adv12's answer更好:設置線程是前臺線程,使應用程序將不會終止,直到他們完成。