如何退出所有正在运行的线程?

Posted

技术标签:

【中文标题】如何退出所有正在运行的线程?【英文标题】:How to exit all running threads? 【发布时间】:2011-02-10 22:45:15 【问题描述】:

以下代码不会退出应用程序。如何退出应用程序并确保所有正在运行的线程都已关闭?

foreach (Form form in Application.OpenForms)

    form.Close();

Application.Exit();

【问题讨论】:

@monkey_boys 你在代码中哪里使用线程? 【参考方案1】:

您没有在代码中显示任何线程的使用,但假设您在其中确实有线程。要关闭所有线程,您应该在启动它们之前将它们全部设置为后台线程,然后它们将在应用程序退出时自动关闭,例如:

Thread myThread = new Thread(...);
myThread.IsBackground = true; // <-- Set your thread to background
myThread.Start(...);

来自 microsoft 的“HOWTO:停止多线程”文章:http://msdn.microsoft.com/en-us/library/aa457093.aspx

【讨论】:

【参考方案2】:

你可以试试下面的代码:

Environment.Exit(Environment.ExitCode);

【讨论】:

我无法阻止库运行的未知线程;这消除了所有线程【参考方案3】:

我在我的软件中遇到了类似的问题,但不幸的是,只是让线程在后台工作并不能解决问题。事实上,当线程带回数据时(主要软件是数据驱动的),如果我关闭应用程序,它会导致 Windows 错误,从而产生调试消息。

那么对我来说真正有用的是什么:

第 1 步: 让所有线程在后台运行,例如

Thread aThread = new Thread(MethodName);
aThread.IsBackground = true; //<-- Set the thread to work in background
aThread.Start();

第二步:在表单/应用的关闭动作中调用Environment.Exit方法,如

Environment.Exit(Environment.ExitCode);

这样可以完美地管理内存,没有内存泄漏。

希望这会有所帮助。

【讨论】:

【参考方案4】:

这应该适用于您打开的所有线程。

protected override void OnExiting(Object sender, EventArgs args)

    base.OnExiting(sender, args);
    Environment.Exit(Environment.ExitCode);

【讨论】:

【参考方案5】:

这是确保您的应用程序关闭(强制)的最佳方式:

(Process.GetCurrentProcess()).Kill()

Environment.Exit 的问题是除非它在主线程上,否则它不起作用。此外,它有时会出现线程锁。

您的程序未正确关闭的主要原因是表单无法自行处理(以及它创建的所有对象)。解决这个问题要困难得多。我建议在等待一段时间后运行上述代码,以便首先调用任何可能的处置处理程序。

【讨论】:

【参考方案6】:

这为我完成了工作:

而不是使用:

Application.Exit() 

这会让其他线程保持打开状态,请尝试使用:

Environment.Exit(Environment.ExitCode);

【讨论】:

对不起,我不是故意的。 Somdip Dey 的回答对我有用。【参考方案7】:

我对此感到困惑一段时间,因为常见的答案是制作您调用的线程mythread.IsBackground = true;

运行线程的常见答案是使用带有标志的 while 循环

while(!exitflag)

    // thread running

当用户按下退出表单按钮时,Visual Studio 仍在运行线程,但表单关闭。我使用了 Form Closing 事件来设置 exitcode 标志,然后等待线程关闭。

我有一个使用 Timer 和两个附加线程的表单,一个收集流数据,另一个对该数据进行计算并保存到 sql 表中。数据收集收集在一个循环缓冲区中。我使用两个静态布尔值作为标志,其中线程使用 mythread.Isalive 将标志设置为 true 或 false,因为 Form Closing 事件无权访问线程句柄。

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

    Debug.WriteLine("Form Closing Event");
    exitFlag = true;
    int ThreadsClosed = 0;
    while (ThreadsClosed < 2)
    
        ThreadsClosed = 2;
        if (ProcessDataAlive) ThreadsClosed = 0;
        if (StreamingDataAlive) ThreadsClosed = 0;
        Application.DoEvents();
    
    Debug.WriteLine("Threads are all closed");
    Thread.Sleep(5000); // allow debug window open to read remove for release

【讨论】:

以上是关于如何退出所有正在运行的线程?的主要内容,如果未能解决你的问题,请参考以下文章

主线程创建了子线程,怎么让主线程退出,而子线程仍然运行

c#关闭窗口怎么强制退出所有运行的线程

如何停止一个正在运行的线程?

如何停止一个正在运行的线程

如何在Python中退出主线程并使子线程在后台继续运行

杀死任一线程并退出进程