代码之家  ›  专栏  ›  技术社区  ›  migajek

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

  •  15
  • migajek  · 技术社区  · 14 年前

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

    5 回复  |  直到 12 年前
        1
  •  21
  •   Mark Byers    14 年前

    最简单的方法是设置 IsBackground 线程的属性设置为true。这将阻止它保持应用程序打开。当所有非后台线程终止时,应用程序终止。

    停止线程的一种更可控的方法是向它发送一条消息,以彻底关闭线程,并确保在让主线程终止之前它已经终止。

    我不推荐的方法是调用 Thread.Abort . 这有许多问题,其中之一是不能保证终止线程。从文档中:

    调用此方法 通常 终止线程。

    强调我的。

        2
  •  3
  •   csharptest.net    14 年前

    您可以强制执行以下问题:

    class Program
    {
        public static void Main()
        {
            // ... do stuff
            Environment.Exit(Environment.ExitCode);
        }
    }
    

    更好的方法是将thread.isbackground属性设置为true,正如前面提到的标记一样。

        3
  •  1
  •   Hans Passant    14 年前

    您可以将while(true)循环改进为

    void DoWork() {
        while(!ShouldIQuitManualResetEvent.WaitOne(0)) {
          // do something
        }
        IDidQuitManualResetEvent.Set()
    }
    

    稍微优雅一点,与标识符名称比较短。

        4
  •  0
  •   Bruno Brant    14 年前

    嗯,而不是 while(true) ,也许你应该:

    while(appIsRunning)
    {
    }
    

    在你的结业典礼上,

    appIsRunning = false;
    thread.Join(2000);
    

    最后一行只是为了确保等待线程干净完成。有很多其他的方法可以迫使一个线程结束,但问题就在这里:你不想这样 强迫 事情,你希望它们尽可能自然地发生。

    在连接之后,您可以检查线程的状态,看看它是否已经完成。如果没有, 然后 (并且只有在那时)通过中止强制完成它,并且可能通知您的用户(或者写一个日志记录),一些事情没有以它应该的方式结束。

        5
  •  0
  •   darja    14 年前

    您可以将线程启动为:

    ThreadPool.QueueUserWorkItem(DoStuff, input)
    

    它将在应用程序关闭时自动中止。