C# 如何关闭Windows服务应用程序的所有后台线程?

C# 如何关闭Windows服务应用程序的所有后台线程?,c#,multithreading,windows-services,C#,Multithreading,Windows Services,我创建了一个windows服务应用程序,在其中我打开了大约10000个线程,我想关闭所有线程,就像关闭winform应用程序时关闭所有后台线程一样,我如何才能做到这一点?我不想在数组中存储对所有这些线程的引用,并使用循环关闭所有线程 在使用Winform应用程序之前以及关闭Winform应用程序时,所有后台线程都会自动关闭。我想完成类似的工作来关闭Windows服务应用程序中的所有线程 任何想法都将不胜感激 我可以看到两个选项来实现您的目标: 让您的服务应用程序启动另一个负责启动线程的可执行程序

我创建了一个windows服务应用程序,在其中我打开了大约10000个线程,我想关闭所有线程,就像关闭winform应用程序时关闭所有后台线程一样,我如何才能做到这一点?我不想在数组中存储对所有这些线程的引用,并使用循环关闭所有线程

在使用Winform应用程序之前以及关闭Winform应用程序时,所有后台线程都会自动关闭。我想完成类似的工作来关闭Windows服务应用程序中的所有线程


任何想法都将不胜感激

我可以看到两个选项来实现您的目标:

  • 让您的服务应用程序启动另一个负责启动线程的可执行程序。然后让您的服务应用程序在需要时终止该可执行程序。可执行程序生成的线程将被终止,但服务不会被终止

  • 在运行线程中设置中断条件。通过设置布尔标志,您可以让线程退出
    而(true)
    并退出可运行委托。(这里我假设您的线程一直在
    中运行,而(true)
    ,否则您不会问这个问题)


  • 如果您只是处理停止消息,而不执行其他操作,那么操作系统应该在大约20秒后停止服务进程中的所有剩余线程

    如果设置线程属性
    myThread.isBackground=true
    ,则当所有前台线程都被终止时(当您关闭应用程序时),线程将终止

    但是,创建10000个线程并不是一件好事,因为操作系统在线程之间切换的时间比实际执行线程代码的时间要多。在普通计算机上执行这么多线程实际上比在2-4核CPU上执行2-16线程(例如)的效率要低

    这是一本关于线程的优秀电子书

    PDF:
    Web:

    如果您只是处理停止消息,而不做任何其他操作,操作系统应该在大约20秒后停止所有线程。我不清楚您的意思是什么?你的意思是如果我只是过度渲染了桌面消息,什么也不做,它会停止所有线程吗?或者你的意思是如果我不跳过OnStop方法,它将关闭所有线程吗?在我的覆盖中,它只有'base.OnStop();'我试过了,但它没有关闭所有线程,你确定要调用base.OnStop真的关闭所有线程吗?嗨,martin james,请将你的答案作为答案发布,我会将它标记为答案,因为这对我有帮助。毫无疑问,它是一个服务器,所以它必须运行。我的意思是,它们并非都处于运行状态,也就是说,大部分/全部被屏蔽了(大概是网络读取)。@MartinJames好的,我应该写“活着”而不是“跑步”。它们不能永远被“阻止”,除非在实现过程中出现问题。有时他们会运行一些代码并最终测试中断条件。如果所有前台线程都被杀死,后台线程也会结束吗?因此,如果应用程序关闭,所有后台线程都会像OP希望的那样结束,而不会跟踪所有线程。因此,如果使用这么多线程不是一个好的做法,请告诉我,如果整个过程在一台机器上执行,我应该用什么方法创建一个服务10000个客户端的TCP服务器,您可以使用允许您对工作项进行排队的线程池。在我的答案()中链接的电子书a中,一切都解释得很好。为什么要投否决票?我已经测试过了,它是有效的。如果线程被阻塞,它就会工作。如果线程处于休眠状态,则它可以工作。如果线程正在运行,它就会起作用。OP的问题基本上归结为“我不知道我在做什么。我如何才能走出我所处的困境?”VinceAnity的正确答案是,“在做之前先学会如何做。这是一个好的开始。”不幸的是,你的答案相当于,“你不需要知道你在做什么。操作系统将自动神奇地为您清理。“尽管这已成为当今软件开发的普遍观点,但仍然是一个可怕的观点。@StephenMartin为什么可怕?”?如果一个复杂的多线程应用程序在您希望关闭它时处于完全不可预测的状态,您打算如何停止它?a) 设计、开发、编写和测试大量复杂、困难、可能不可靠的线程关闭代码,这些代码在阻塞和运行状态下都难以停止线程。b) 调用ExitProcess(0)。'在许多应用程序中,用用户代码完全关闭线程是不现实的。在释放正在使用的资源之前,只有操作系统具有停止所有内核上处于所有状态的所有线程的工具。