是否可以清除ThreadPool?
是否从ThreadPool中删除项目?
诸如此类的事?
ThreadPool.QueueUserWorkItem(GetDataThread);
RegisteredWaitHandle Handle = ThreadPool.RegisterWaitForSingleObject(CompletedEvent, WaitProc, null, 10000, true);有什么想法吗?
发布于 2010-07-27 01:20:51
如果您需要这种行为,我推荐使用Task类(在.NET 4.0中添加)。它支持取消,您可以让任意数量的任务侦听相同的取消令牌,这使得您可以通过一个方法调用将它们全部取消。
更新(非4.0解决方案):
你真的只有两个选择。第一:实现你自己的事件多路分解器(由于64个句柄的等待限制,这比看起来要复杂得多);我不推荐这样做-我不得不做一次(在非托管代码中),而且它很可怕。
剩下的第二个选择是:有一个取消任务的信号。当然,RegisteredWaitHandle.Unregister可以取消RWFSO部分。QUWI更为复杂,但可以通过让操作感知"token“值来完成。当该操作执行时,它首先检查令牌值与其存储的令牌值;如果它们不同,则不应执行任何操作。
需要考虑的一件主要事情是竞争条件。只需记住,在取消操作和执行它的ThreadPool之间存在竞争条件,因此可以看到在取消之后运行的操作。
我有a blog post on this concept,我称之为“异步回调上下文”。博客文章中提到的CallbackContext类型可以在Nito.Async库中找到。
发布于 2010-07-27 00:19:04
没有用于删除排队项的接口。然而,没有什么能阻止你“毒害”这个委托,让它立即返回。
编辑
基于Paul所说的,我认为您可能还想考虑流水线架构,在这种架构中,有固定数量的线程从阻塞队列读取数据(就像.NET 4.0的BlockingCollection on a ConcurrentQueue)。这样,如果您想取消项目,您可以自己访问队列。
话虽如此,斯蒂芬关于Task的建议可能更好,因为它给了你所有你实际想要的控制,而不是所有你自己的管道涉及的繁重工作。我提到这一点只是为了完成。
发布于 2010-07-27 00:27:17
ThreadPool的存在是为了帮助你管理你的线程。您根本不必担心清除它,因为它将代表您做出最佳的性能决策。
如果您认为需要对线程进行更严格的控制,那么您可以考虑创建自己的线程管理类(类似于ThreadPool),但是要与ThreadPool内置的功能相匹配并超越它,需要进行大量的工作。
以a look here的一些ThreadPool优化及其背后的想法为例。
对于我的第二点,我发现an article on Code Project实现了一个“可取消的线程池”,可能是出于您自己的一些类似原因。如果你要写你自己的代码,这将是一个很好的开始。
https://stackoverflow.com/questions/3336748
复制相似问题