在C#.Net中,前台线程是否可以在应用程序关闭时中止?
我继承了一个c#winforms应用程序(.NET2.0),它在单例类中启动时创建一个线程。此线程处理来自消息传递主题(Tibco EMS)的消息 当应用程序关闭时,线程不会保留在后台?这怎么可能?是否有其他事件会中止此线程 代码段:在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
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
}
}
}
--编辑--
您说您正在寻找一种解释,说明应用程序如何在工作线程无限循环的情况下终止。有几种方法可以实现这一点
您是否验证了进程终止时工作线程上没有引发异常?如果您将我的代码复制到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
}
}
}