2014-05-04 67 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更好:设置线程是前台线程,使应用程序将不会终止,直到他们完成。