gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:30:39 24 4
gpt4 key购买 nike

我们有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com