【问题标题】:Clearing the ThreadPool清除线程池
【发布时间】:2009-09-23 21:07:45
【问题描述】:

我正在使用 C# 在 Visual Studio 2008 中开发我的第一个 ThreadPool 应用程序。

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

我在一个线程池中排队所有的零件号,在那里他们开始计算他们的结果。当这些线程完成后,RegisterWaitForSingleObject 事件会触发以取消注册队列项的句柄。

在所有 Queued Items 完成后,有没有办法将它们从 ThreadPool 中删除?

看起来,如果有人使用一组新的 2000 到 4000 个部件运行另一个报告,我无法删除之前的部件数组。

如何删除先前排队的项目?用 workerThreads = 0 调用 SetMaxThreads 可以吗?

我意识到我可以进行实验,但我可能会浪费一周的大部分时间进行实验。

感谢您的宝贵时间,

【问题讨论】:

    标签: c# threadpool


    【解决方案1】:

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

    【讨论】:

    • 没有任何迹象表明他们不是……但同时,没有任何迹象表明他们是!我找不到任何说明进入队列的旧项目曾经已发布的文档。感谢您的回答!乔
    【解决方案2】:

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

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

    然后您可以中止自定义队列并开始一个新队列。

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

    【讨论】:

    • 感谢 Gravell 先生的帮助。我会说我已经已经运行了 GetMaxThreads(out workerThreads, out completionPortThreads),将两个值加倍,然后通过调用 ThreadPool.SetMaxThreads(workerThreads, completionPortThreads) 测试保存它们。该设置将保持活动多长时间,就在父进程处于活动状态时,直到我重新启动,或者直到我再次使用另一个值调用 SetMaxThreads?
    • 我怀疑每个进程或直到您再次更改它。
    猜你喜欢
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多