我有一个应用程序,它在一个单独的Thread
中执行一些后台任务(网络收听和阅读)。但是,当我关闭应用程序时,似乎Thread没有被终止/中止(单击标题栏上的“x”按钮)。
那是因为主线程例程是while(true) {...}
吗?
这里有什么解决方案?我正在为Thread寻找一些“中断”标志作为“while”循环的条件,但没有找到任何。
答案 0 :(得分:21)
最简单的方法是将线程的IsBackground属性设置为true。这将阻止它保持应用程序打开。当所有非后台线程终止时,应用程序终止。
一种更受控制的停止线程的方法是向它发送一条消息,以便在主线程终止之前干净地关闭并确保它已经终止。
我不建议使用的方法是致电Thread.Abort
。这有许多问题,其中之一是无法保证终止线程。来自文档:
调用此方法通常会终止该帖子。
强调我的。
答案 1 :(得分:3)
您可以随时强制解决问题:
class Program
{
public static void Main()
{
// ... do stuff
Environment.Exit(Environment.ExitCode);
}
}
更好的方法是将Thread.IsBackground属性设置为true,如Mark已经提到的那样。
答案 2 :(得分:1)
你可以改进while(true)循环
void DoWork() {
while(!ShouldIQuitManualResetEvent.WaitOne(0)) {
// do something
}
IDidQuitManualResetEvent.Set()
}
更优雅,与标识符名称相比更短。
答案 3 :(得分:0)
嗯,而不是while(true)
,也许你应该:
while(appIsRunning)
{
}
并且,在您的表单的结束活动中,
appIsRunning = false;
thread.Join(2000);
最后一行只是为了确保你等待线程干净地完成。还有很多其他方法可以强制结束一个线程,但问题就出现了:你不想强制事情,你希望它们尽可能自然地发生。
在加入之后,您可以检查线程的状态以查看它是否已完成。如果没有,那么(并且只有那时)强制终止中止,并且可能通知你的用户(或写一个日志记录)某些东西没有以它应该的方式结束。
答案 4 :(得分:0)
您可以将您的主题开始为:
ThreadPool.QueueUserWorkItem(DoStuff, input)
当应用程序关闭时,它会自动中止。