应用程序关闭时线程不会中止

时间:2010-05-17 21:45:23

标签: c# multithreading terminate abort interruption

我有一个应用程序,它在一个单独的Thread中执行一些后台任务(网络收听和阅读)。但是,当我关闭应用程序时,似乎Thread没有被终止/中止(单击标题栏上的“x”按钮)。 那是因为主线程例程是while(true) {...}吗? 这里有什么解决方案?我正在为Thread寻找一些“中断”标志作为“while”循环的条件,但没有找到任何。

5 个答案:

答案 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)

当应用程序关闭时,它会自动中止。