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

C# 如何清除线程池?[Microsoft System.Threading.ThreadPool],c#,threadpool,C#,Threadpool,是否可以清除线程池 是否从线程池中删除项目 有那样的事吗 ThreadPool.QueueUserWorkItem(GetDataThread); RegisteredWaitHandle Handle = ThreadPool.RegisterWaitForSingleObject(CompletedEvent, WaitProc, null, 10000, true); 有什么想法吗?没有用于删除排队项目的接口。但是,没有什么可以阻止您“毒害”委托,使其立即返回 编辑 基于保罗所说的,我想

是否可以清除线程池

是否从线程池中删除项目

有那样的事吗

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

有什么想法吗?

没有用于删除排队项目的接口。但是,没有什么可以阻止您“毒害”委托,使其立即返回

编辑

基于保罗所说的,我想你可能还想考虑一个流水线结构,在这里你有一个固定的线程从一个阻塞队列中读取(比如.NET 4的代码> BuffjCopys<代码> > <代码>并发队列)。这样,如果您想取消项目,您可以自己访问队列


话虽如此,Stephen关于
任务
的建议可能更好,因为它提供了您实际需要的所有控制,而无需像滚动自己的管道那样进行所有艰苦的工作。我提到这一点只是为了补充。

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

如果你认为你需要对线程进行更严格的控制,那么你可以考虑创建自己的线程管理类(类似于THealCube),但是要匹配和超过线程池已经建立的功能需要花费大量的工作。 了解一些线程池优化及其背后的想法


关于我的第二点,我发现它实现了一个“可取消的线程池”,可能是出于您自己类似的原因。如果你打算自己写,那么这将是一个开始寻找的好地方。

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

更新(非4.0解决方案):

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

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

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


我有,我称之为“异步回调上下文”。库中提供了博客文章中提到的
CallbackContext
类型。

Steven:你的意思是在
GetDataThread
中添加导致其返回的内容吗?是的,没错。新作业在开始时检查并在检测到时立即失败的东西。一个不稳定的bool就可以了。重申一下Stephen所说的,取消本质上涉及到竞争条件,所以你应该期望它只会在工作开始之前停止工作。可以说,您可以在其他方便的时间间隔检查cancel标志,但这有点不确定。出于某种原因,这只是被否决了,尽管完全正确。代码项目文章使用了Abort,这不是一个好主意。也就是说,您有一个观点,即可能没有任何实际需要清除池。+1,但管理层不希望此时在我们的基础架构中实现.NET 4.0。@jp2code:那太糟糕了。NET4.0为.NET中的多线程处理带来了巨大而有用的变化。有关.NET 4.0之前的解决方案,请参阅我的更新答案。