如何在程序关闭时强制退出所有程序线程?

12

如何确保在关闭主窗口后所有程序线程都会中止?


线程是否设置为后台线程? - Lasse V. Karlsen
1
避免使用“fire-and-forget”线程。Environment.Exit()是Q&D解决方案。 - Hans Passant
6个回答

18
您可以将“IsBackground”属性设置为true。应用程序退出时,CLR会关闭所有后台线程。

13
  • 如果您已经设计好线程,您应该有一种机制来关闭它们-例如使用ManualResetEvent来发出关闭信号
  • 您可以使用Thread.Join等待它们关闭,或使用Thread.Abort以恶劣的方式中止它们
  • 如果它们是后台线程,当应用程序关闭时它们也会关闭

另请参阅:http://msdn.microsoft.com/en-us/library/7a2f3ay4(v=vs.80).aspx


我会添加标准注释 - 永远不要使用abort(在S / O上搜索以查看为什么这是一个非常糟糕的想法的所有细节)。 - David Thielen
1
请阅读原因,因为在大多数情况下,这是一个完全可以接受的妥协。很抱歉,“永远不要使用abort”是错误的。 - Kieren Johnstone
2
说得好。如果你不理解反对的论点,也没有其他选择,那就不要这样做。 - David Thielen

6

请尝试

Application.ExitThread();
Environment.Exit(0);

或者
Dispatcher.CurrentDispatcher.Thread.Abort();

0

将它们收集到某个地方,比如

static public List<Thread> AllThreads;

使用该集合逐个调用.Abort()方法来终止它们。

这是一种困难错误的方式。更好的方法是以某种方式通知它们停止,然后逐个调用.Join()方法。


你是指 .Abort() 吗?.Terminate 不存在。 - Kieren Johnstone
另外,如果你有一个列表,为什么不使用 AllThreads.ForEach(t => t.Abort()); 呢? - Kieren Johnstone
@KierenJohnstone 当我说一个接一个地终止它们时,这正是我的意思。无论使用Lambda与否,您都是一个接一个地终止它们。 - Daniel Mošmondor
我认为提供一个实际的例子会更好,这只是一个建议 :) - Kieren Johnstone
是的,很酷。我喜欢lambda表达式,但是它们有点难以调试。无论如何,如果OP懒得想不到其他停止线程的方法,才应该使用.Abort()。 - Daniel Mošmondor

0

IsBackground属性设置为true,并添加以下行:

AppDomain.CurrentDomain.ProcessExit += CloseMe; // for the main process
AppDomain.CurrentDomain.DomainUnload += CloseMe; // for ApplicationDomains

CloseMe方法设置一个标志,在线程的主循环中进行检查。

-2
通过让程序真正关闭,即不故意引入任何强制主窗口线程等待其他线程的代码。运行主窗口的线程将自由地退出进程(exitProcess()),操作系统将终止该进程中的所有其他线程,无论它们正在做什么。
顺祝商祺, 马丁

在.NET上,默认情况下,非后台线程将意味着应用程序不会简单地“关闭”。如果您调用ExitProcess(在.NET世界中称为Environment.Exit),那么它将起作用。 - Kieren Johnstone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接