代码之家  ›  专栏  ›  技术社区  ›  jp2code

如何清除线程池[[Microsoft System.Threading.ThreadPool]

  •  0
  • jp2code  · 技术社区  · 14 年前

    是否可以清除线程池?

    从线程池中删除项目?

    有类似的吗?

    ThreadPool.QueueUserWorkItem(GetDataThread);
    RegisteredWaitHandle Handle = ThreadPool.RegisterWaitForSingleObject(CompletedEvent, WaitProc, null, 10000, true);
    

    有什么想法吗?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Stephen Cleary    14 年前

    我建议使用 Task 类(在.NET4.0中添加),如果您需要这种行为。它支持 取消 ,并且您可以让任意数量的任务侦听同一取消令牌,这使您能够通过单个方法调用取消所有任务。

    你真的只有两个选择。一:实现自己的事件解复用器(由于64句柄等待限制,这比看起来要复杂得多);我不能推荐这样做-我不得不做一次(在非托管代码中),而且很可怕。

    剩下的第二个选择是:发出取消任务的信号。当然, RegisteredWaitHandle.Unregister 可以取消RWFSO部分。QUWI更复杂,但是可以通过让动作意识到一个“令牌”值来完成。当动作执行时,它首先检查令牌值和它存储的令牌值;如果他们是不同的,那么它不应该做任何事情。

    要考虑的一个主要问题是比赛条件。请记住,在取消操作和线程池执行操作之间存在竞争条件,因此可以看到操作在取消之后运行。

    我有 a blog post on this concept ,我称之为“异步回调上下文”。这个 CallbackContext 博客文章中提到的类型可以在 Nito.Async 图书馆。

        2
  •  3
  •   Steven Sudit    14 年前

    编辑

    BlockingCollection ConcurrentQueue

    话虽如此,斯蒂芬的建议 Task

        3
  •  1
  •   Paul Sasik    14 年前

    线程池的存在是为了帮助您管理线程。您完全不必担心清除它,因为它将代表您做出最佳性能决策。

    如果您认为需要对线程进行更严格的控制,那么您可以考虑创建自己的线程管理类(类似于ThreadPool),但要匹配和超越ThreadPool内置的功能需要做大量的工作。

    a look here 在一些线程池优化和背后的想法。

    an article on Code Project 它实现了一个“可取消的线程池”,可能是出于某些类似的原因。如果你打算自己写的话,这是一个开始寻找的好地方。