c# - 应用程序不会以 0 个线程退出

标签 c# winforms join multithreading termination

我们有一个 WinForms 桌面应用程序,它是高度多线程的。 3 个线程与 Application.Run 和一堆其他后台工作线程一起运行。让所有线程正确关闭有点棘手,但我认为我终于做对了。

但是当我们实际部署应用程序时,用户开始体验到应用程序没有退出。有一个 System.Threading.Mutex 可以防止他们多次运行该应用程序,因此他们必须进入任务管理器并杀死旧的,然后才能再次运行它。

在主线程退出之前,每个线程都会获得一个 Thread.Join,并且我向我生成的每个线程添加了日志记录。根据日志,每一个启动的单线程也退出了,主线程也退出了。更奇怪的是,运行 SysInternals ProcessExplorer 显示所有线程在应用程序退出时消失。如同,有 0 个线程(托管或非托管),但进程仍在运行。

我无法在任何开发人员计算机或我们的测试环境上重现此问题,到目前为止,我只看到它发生在 Windows XP(不是 Vista 或 Windows 7 或任何 Windows Server)上。一个进程如何在 0 个线程的情况下继续运行?

编辑:

这里有更多细节。事件循环之一是承载一个 Win32 互操作 DLL,它使用 COM 对象与设备驱动程序对话。我将它放在自己的线程中,因为设备驱动程序对时间敏感,每当 UI 线程阻塞很长时间(例如等待数据库调用完成)时,它就会干扰设备驱动程序。

所以我更改了代码,以便主线程与设备驱动程序线程执行 Thread.Join。这实际上导致应用程序锁定……在 Join 完成后,它在 UI 线程上记录了更多调用,然后一切都停止了。如果设备断电,驱动程序永远不会启动,问题就会消失。所以看起来驱动程序必须负责保持应用程序的事件,即使在它应该被关闭之后也是如此。

最佳答案

当您创建您的线程时,为它们设置 IsBackground=true。当您的主 ui 线程/应用程序关闭时,所有创建的线程将自动关闭。

http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground.aspx

关于c# - 应用程序不会以 0 个线程退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2699893/

相关文章:

php - 使用多个联接和 Group_Concat 优化 php mySQL 查询

c# - 在 C# 中加密文件的最简单方法是什么?

c# - 使用 Linq 从树中获取具有特定属性的所有对象

c# - 快速图书与 C# Windows 应用程序集成

c# - C# 中的选项卡式用户界面

c# - 如何在窗体中制作圆形标签?

mysql - 如何在某些行被多次计数的情况下进行查询?

c# - 以编程方式创建应用程序和服务

c# - 如何聆听某个进程发出的音频并将其与 5 秒的声音进行比较?

mysql - 何时在 MySQL 中使用 STRAIGHT_JOIN