C# 在系统线程池中仍有工作的情况下,是否有任何方法阻止应用程序关闭

C# 在系统线程池中仍有工作的情况下,是否有任何方法阻止应用程序关闭,c#,multithreading,C#,Multithreading,今天的最后一个问题:)谢谢你在前面的问题上的意见。 顺便说一句:已经在论坛上搜索过了,没有什么能完全回答这个问题 我们使用一些第三方库将工作弹出到线程池中,我们不希望在有未完成的活动时关闭 关闭应用程序时,即使System.Threading.ThreadPool中有未完成的工作,应用程序也会关闭,因为这些线程是后台线程 除了执行某种形式的引用计数(并强制每个排队到池中的项使用此机制,我们无法控制)之外,还有什么方法可以在有未完成的工作要完成时停止应用程序关闭 我已经研究过如何使用GetAvai

今天的最后一个问题:)谢谢你在前面的问题上的意见。 顺便说一句:已经在论坛上搜索过了,没有什么能完全回答这个问题

我们使用一些第三方库将工作弹出到线程池中,我们不希望在有未完成的活动时关闭

关闭应用程序时,即使System.Threading.ThreadPool中有未完成的工作,应用程序也会关闭,因为这些线程是后台线程

除了执行某种形式的引用计数(并强制每个排队到池中的项使用此机制,我们无法控制)之外,还有什么方法可以在有未完成的工作要完成时停止应用程序关闭

我已经研究过如何使用GetAvailableThreads()和GetMaxThreads(),但它们可能是相同的,因为我们可能捕获到线程池,因为线程被释放,但没有分配队列工作项

感谢所有的帮助

问候
Noel

除非您可以对第三方代码进行某种回调(可能是完成事件),否则您将很难知道他们何时停止使用
线程池。很抱歉此类代码通常应位于非后台线程上。我意识到你无法控制这一点——我也不确定有没有一条简单的出路。

我认为马克·格雷维尔是对的。不过,如果您能够以某种方式访问线程池中正在使用的线程,那么您可以将thread.IsBackground属性更改为false以实现所需的功能。但我不确定如何在线程池中获得对托管线程的引用。

因为我是真正的程序员(这是C,boys;-),所以我没有使用线程池

然而,我想到了一个建议——在您发布到线程池中的每个任务上都有一个信号量增量,并且在完成时释放该信号量

当你的应用程序退出时,等待信号灯


有什么用吗?

谢谢你的回复。我在线程池之外找到了一个解决方案,使用AOP和动态代理在类周围注入引用计数。幸运的是,这个类公开了一个干净的界面,我可以将其包装起来,效果很好。

谢谢Marc。虽然这可能是一个尴尬的问题。不确定您使用的是哪种第三方库,但可能该库公开了一个函数来检查它是否仍在处理其任务?或者,用一个函数以干净的方式关闭它?谢谢Bartoz,但不幸的是没有。谢谢,但它是一个第三方库,无法访问它们的代码来修改引用计数等内容。大概在给定任务完成时会有某种通知?你不需要修改他们的代码——这是你的信号量,你在输入的过程中递增,然后在完成时释放。当您的进程想要完成时,等待信号量。