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

mon*_*oys 57 .net c# multithreading winforms

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

foreach (Form form in Application.OpenForms)
{
    form.Close();
}
Application.Exit();
Run Code Online (Sandbox Code Playgroud)

Kir*_*ril 89

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

Thread myThread = new Thread(...);
myThread.IsBackground = true; // <-- Set your thread to background
myThread.Start(...);
Run Code Online (Sandbox Code Playgroud)

微软的"HOWTO:Stop Multiple Threads"一文:http://msdn.microsoft.com/en-us/library/aa457093.aspx


Ame*_*lla 52

您可以尝试以下代码:

Environment.Exit(Environment.ExitCode);
Run Code Online (Sandbox Code Playgroud)


Som*_*Dey 24

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

那么实际上对我有用的是什么:

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

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

第2步:在表单/应用程序的结束操作中调用Environment.Exit方法,例如

Environment.Exit(Environment.ExitCode);
Run Code Online (Sandbox Code Playgroud)

这使内存管理完美,没有内存泄漏.

希望这可以帮助.


小智 13

这适用于您打开的所有线程.

protected override void OnExiting(Object sender, EventArgs args)
{
    base.OnExiting(sender, args);
    Environment.Exit(Environment.ExitCode);
}
Run Code Online (Sandbox Code Playgroud)


小智 7

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

(Process.GetCurrentProcess()).Kill()

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

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


小智 6

这为我完成了工作:

而不是使用:

Application.Exit() 
Run Code Online (Sandbox Code Playgroud)

这会使其他线程处于打开状态,请尝试使用:

Environment.Exit(Environment.ExitCode);
Run Code Online (Sandbox Code Playgroud)