我已经创建了一个 Windows 服务应用程序,我打开了大约 10000 个线程,我想关闭所有线程,就像我关闭 winform 应用程序时所有后台线程都关闭一样,我该如何实现?我不想将所有这些线程的引用存储在一个数组中并使用循环关闭所有线程。
在我使用 Winform 应用程序之前以及当我关闭 winform 应用程序时,所有后台线程都会自行关闭。我想完成类似的事情来关闭 Windows 服务应用程序中的所有线程
任何想法将不胜感激。
我已经创建了一个 Windows 服务应用程序,我打开了大约 10000 个线程,我想关闭所有线程,就像我关闭 winform 应用程序时所有后台线程都关闭一样,我该如何实现?我不想将所有这些线程的引用存储在一个数组中并使用循环关闭所有线程。
在我使用 Winform 应用程序之前以及当我关闭 winform 应用程序时,所有后台线程都会自行关闭。我想完成类似的事情来关闭 Windows 服务应用程序中的所有线程
任何想法将不胜感激。
如果你设置了 thread 属性myThread.isBackground = true
,线程将随着所有前台线程被杀死(当你关闭应用程序时)而死。
但是,创建 10 000 个线程并不是一件好事,因为操作系统将花费更多时间在线程之间切换而不是实际执行线程的代码。在普通计算机上执行这么多线程实际上比在 2 - 4 核 CPU 上执行 2 - 16 个线程(例如)效率低。
这是一本关于线程的优秀电子书。
PDF:http ://www.albahari.info/threading/threading.pdf 网站:http ://www.albahari.com/threading/
我可以看到两个选项来实现您的目标:
让您的服务应用程序启动另一个负责启动线程的可执行程序。然后让您的服务应用程序在需要时终止该可执行程序。Executable 程序产生的线程将被杀死,但服务不会。
在正在运行的线程中放置一个中断条件。通过设置一个布尔标志,您可以让您的线程退出while (true)
并退出 Runnable 委托。(这里我假设你的线程一直在运行while (true)
,否则你不会问这个问题)。
如果您只处理停止消息而不执行其他任何操作,则操作系统应在约 20 秒后停止服务进程中的所有剩余线程。