2009-09-21 40 views
0

我正在使用C#在Visual Studio 2008中处理我的第一个ThreadPool应用程序。清除线程池

我有一份报告,必须使用我们的SQL Server上的数据对2000到4000部件进行计算。

我正在排队一个ThreadPool中的所有零件编号,它们在哪里关闭并计算其结果。当这些线程完成后,RegisterWaitForSingleObject事件触发取消注册排队项目的句柄。

所有排队的项目完成后,有没有办法将它们从ThreadPool中删除?

它的样子,如果有人使用2000到4000部分的新组合来运行另一个报告,我无法删除以前的部件数组。

我将如何删除以前排队的项目?用workerThreads = 0调用SetMaxThreads会做到吗?

我意识到我可以尝试,但是我可能会浪费本周大部分时间的试验。

感谢您的时间,

回答

4

一旦ThreadPool项目完成后,它会自动从队列中删除。什么向你表明他们不是?

+0

没有表明他们不是......但同时,没有任何迹象表明他们是!我无法找到任何说明进入队列的旧项目被发布的文档。 感谢您的回答! Joe – jp2code

2

假设你的意思是中断(取消)对当前队列中的工作...

更改最大线程不会影响待审批工作;它只会改变可用线程的数量 - 这通常是一个坏主意(你的代码不是唯一使用ThreadPool的东西)。我将使用自定义队列 - 编写基本(线程安全)的生产者/消费者队列相当容易,或者.NET 4.0包含一些非常好的自定义线程队列。

然后您可以放弃自定义队列并启动一个新队列。

我写了一个简单的here;此时它希望在终止之前干净地退出(即排空队列直到它为空),但是在当前项目之后添加一个标志以立即停止将很容易(不要中断/中止线程执行中的任意点;从来不是一个好主意)。

+0

感谢Gravell先生的帮助。我会说我已经运行了GetMaxThreads(在workerThreads之外,在completionPortThreads之外),两个值都加倍了,然后测试了通过调用ThreadPool.SetMaxThreads(workerThreads,completionPortThreads)来保存它们。只要父进程处于活动状态,直到我重新启动,或直到我再次用另一个值调用SetMaxThreads,该设置才会保持活动状态多久? – jp2code

+1

每个过程或直到你再次改变它,我怀疑。 –