有没有办法阻止应用程序关闭仍在系统Threadpool中的工作

时间:2009-04-16 11:36:56

标签: c# multithreading

今天的最后一个问题:)感谢您对以前的投入。 顺便说一句:已经在论坛上搜索了这个,没有什么能回答这个问题。

我们使用了一些第三方库,它们将工作弹出到Threadpool上,我们不希望在有未完成的活动时关闭。

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

除了执行某种形式的引用计数(并强制执行排队到池中的每个项目以使用我们无法控制的此机制)之外还有一些方法可以阻止应用程序关闭而完成。

我已经看过使用GetAvailableThreads()和GetMaxThreads(),但这些可能是相同的,因为我们可能已经捕获了Threadpool,因为线程被释放但没有分配排队的工作项。

所有帮助表示赞赏?

亲切的问候 诺尔

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

因为我是真正的程序员(那是C,男孩;-)我没有使用ThreadPool。

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

当您的应用退出时,请等待信号量。

有用吗?

答案 2 :(得分:0)

我认为Marc Gravell是对的。虽然如果你能以某种方式访问​​线程池中使用的线程,那么你可以将Thread.IsBackground属性更改为false以实现你想要的。但我不确定如何在线程池中获取对托管线程的引用。

答案 3 :(得分:0)

感谢您的回复。我已经在线程池之外找到了一个解决方法,使用AOP和Castle Windsors动态代理来注入围绕类的引用计数。对我来说幸运的是,这个课程暴露了一个干净的界面,我可以将其包裹起来并且它可以实现一种享受。