首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何清除ThreadPool?[微软System.Threading.ThreadPool]

如何清除ThreadPool?[微软System.Threading.ThreadPool]
EN

Stack Overflow用户
提问于 2010-07-27 00:17:34
回答 3查看 1.1K关注 0票数 0

是否可以清除ThreadPool?

是否从ThreadPool中删除项目?

诸如此类的事?

代码语言:javascript
复制
ThreadPool.QueueUserWorkItem(GetDataThread);
RegisteredWaitHandle Handle = ThreadPool.RegisterWaitForSingleObject(CompletedEvent, WaitProc, null, 10000, true);

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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库中找到。

票数 4
EN

Stack Overflow用户

发布于 2010-07-27 00:19:04

没有用于删除排队项的接口。然而,没有什么能阻止你“毒害”这个委托,让它立即返回。

编辑

基于Paul所说的,我认为您可能还想考虑流水线架构,在这种架构中,有固定数量的线程从阻塞队列读取数据(就像.NET 4.0的BlockingCollection on a ConcurrentQueue)。这样,如果您想取消项目,您可以自己访问队列。

话虽如此,斯蒂芬关于Task的建议可能更好,因为它给了你所有你实际想要的控制,而不是所有你自己的管道涉及的繁重工作。我提到这一点只是为了完成。

票数 3
EN

Stack Overflow用户

发布于 2010-07-27 00:27:17

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

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

a look here的一些ThreadPool优化及其背后的想法为例。

对于我的第二点,我发现an article on Code Project实现了一个“可取消的线程池”,可能是出于您自己的一些类似原因。如果你要写你自己的代码,这将是一个很好的开始。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3336748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档