我有一个应用程序,它在单独的Thread
. 然而,当我关闭应用程序(单击标题栏上的“x”按钮)时,似乎线程没有被终止/中止。那是因为主线程例程是while(true) {...}
?这里的解决方案是什么?我一直在寻找线程的一些“中断”标志作为“while”循环的条件,但没有找到。
问问题
9759 次
5 回答
23
最简单的方法是将线程的IsBackground属性设置为 true。这将阻止它保持应用程序打开。当所有非后台线程终止时,应用程序终止。
停止线程的一种更可控的方法是向它发送一条消息以干净地关闭,并确保它在让主线程终止之前已经终止。
我不推荐的一种方法是调用Thread.Abort
. 这有许多问题,其中之一是不能保证终止线程。从文档中:
调用此方法通常会终止线程。
强调我的。
于 2010-05-17T21:46:25.493 回答
4
你总是可以强迫这个问题:
class Program
{
public static void Main()
{
// ... do stuff
Environment.Exit(Environment.ExitCode);
}
}
更好的方法是将 Thread.IsBackground 属性设置为 true,正如 Mark 已经提到的。
于 2010-05-17T22:50:06.353 回答
1
您可以将 while(true) 循环改进为
void DoWork() {
while(!ShouldIQuitManualResetEvent.WaitOne(0)) {
// do something
}
IDidQuitManualResetEvent.Set()
}
更优雅一点,从标识符名称开始。
于 2010-05-17T21:55:06.170 回答
0
好吧,while(true)
也许你应该:
while(appIsRunning)
{
}
而且,在您的表格的闭幕式上,
appIsRunning = false;
thread.Join(2000);
最后一行只是为了确保您等待线程干净地完成。有许多其他方法可以强制结束线程,但问题就在那里:你不想强迫事情,你希望它们尽可能自然地发生。
加入后,您可以检查线程的状态以查看它是否已完成。如果没有,那么(并且只有在那时)通过中止强制其完成,并可能通知您的用户(或写入日志记录)某些事情没有按照应有的方式结束。
于 2010-05-17T21:51:47.083 回答
0
你可以开始你的线程:
ThreadPool.QueueUserWorkItem(DoStuff, input)
它会在应用程序关闭时自动中止。
于 2010-05-17T23:16:35.023 回答