16

我有一个应用程序,它在单独的Thread. 然而,当我关闭应用程序(单击标题栏上的“x”按钮)时,似乎线程没有被终止/中止。那是因为主线程例程是while(true) {...}?这里的解决方案是什么?我一直在寻找线程的一些“中断”标志作为“while”循环的条件,但没有找到。

4

5 回答 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 回答