在C#.Net中,前台线程是否可以在应用程序关闭时中止?

在C#.Net中,前台线程是否可以在应用程序关闭时中止?,c#,C#,我继承了一个c#winforms应用程序(.NET2.0),它在单例类中启动时创建一个线程。此线程处理来自消息传递主题(Tibco EMS)的消息 当应用程序关闭时,线程不会保留在后台?这怎么可能?是否有其他事件会中止此线程 代码段: public class Startup { public static void main(string [] args) { MySingletonClass.Instance.Init(); // do other th

我继承了一个c#winforms应用程序(.NET2.0),它在单例类中启动时创建一个线程。此线程处理来自消息传递主题(Tibco EMS)的消息

当应用程序关闭时,线程不会保留在后台?这怎么可能?是否有其他事件会中止此线程

代码段:

public class Startup {
    public static void main(string [] args) {
        MySingletonClass.Instance.Init();
       // do other things below
       Application.Run(new MainForm());
    }

public class MySingletonClass {
// singleton code
//..
//..

private Thread t;  
public void Init() {
    t = new Thread(new ThreadStart(poll));
    t.Start();
}

private void poll() {
    while(true} {
        // listen for messages and process but there is no break clause
        // exceptions are also handled within to ensure control doesnt go out
    }
}
请。不要写信告诉我这是错误的代码。我知道这一点,当我意识到应用程序实际上在这种异常情况下正确关闭时,我正打算对其进行重构。 所以我想知道这是怎么可能的


感谢您的帮助

有两种类型的托管线程可由
系统创建。线程。线程
类:

前台线程将保持进程运行,但是在所有前台线程终止后,系统将停止所有后台线程并停止进程。默认情况下,使用
System.Thread.Thread
创建的线程是前台线程。您可以使用I:


默认情况下,使用new Thread()创建的线程是前台线程。这些线程阻止进程退出(正如heavyd提到的)。如果您只是将设置为true,则关闭应用程序将终止后台线程

您可以引入一些逻辑来终止轮询过程。例如,您可以添加一个设置布尔标志的
Stop()
方法。然后让
Poll()
方法持续检查此标志的状态。如果您在轮询逻辑中有某种超时以持续停止消息轮询,则此操作有效

public class MySingletonClass
{
    private bool continuePolling = true;

    public void Stop()
    {
        continuePolling = false;
    }

    public void Poll()
    {
        while (continuePolling)
        {
            // polling for messages here
        }
    }
}
--编辑--

您说您正在寻找一种解释,说明应用程序如何在工作线程无限循环的情况下终止。有几种方法可以实现这一点

  • 当用户关闭应用程序时,状态可能会更改,并且此状态可能会触发旋转线程中的异常。未处理的异常将导致线程终止
  • 循环线程可能已在其他地方更改为后台线程
  • 可能有人正在呼叫,这将强制进程立即终止
  • 可能会在工作线程上引发ThreadAbortException。这将终止线程

  • 您是否验证了进程终止时工作线程上没有引发异常?

    如果您将我的代码复制到Visual Studio中的新Winforms应用程序中,您将看到当您关闭表单时(通过单击X),该应用程序将继续运行。这是因为上面的线程t是前景线程。然而,它似乎在这个特定的应用程序中工作。鉴于该应用程序庞大的代码库,将其全部发布在这里是不可行的。因此,我想知道是否有其他方法可以自动中止线程。将线程设置为后台线程是否有问题?只需添加
    t.IsBackground=true
    t=新线程(新线程开始(轮询))
    将自动关闭你的线程。我不是在寻找解决方案。我正在寻找一个不应该发生的行为的解释(即前景线程退出无限循环)只是为了澄清这个问题:你是说,出于某种未知的原因,当应用程序退出时,你的衍生线程正在退出,你想知道为什么会发生吗?是的,我不知道应用程序中止时前台线程如何终止(代码中没有中止它的逻辑),多亏了这个解决方案。然而,我正在寻找一个解释(当应用程序关闭并且用户没有明确地使其脱离循环时,前台线程如何能够退出无限循环)
    public class MySingletonClass
    {
        private bool continuePolling = true;
    
        public void Stop()
        {
            continuePolling = false;
        }
    
        public void Poll()
        {
            while (continuePolling)
            {
                // polling for messages here
            }
        }
    }