我有一个实现Begin / End Invocation模式的类,我最初使用ThreadPool.QueueUserWorkItem()来处理我的工作.在线程上完成的工作不会循环,但需要花费一些时间来处理,因此工作本身不容易停止.
我现在有副作用,有人使用我的类调用Begin(带回调)很多次来做很多处理,所以ThreadPool.QueueUserWorkItem创建了大量的线程来进行处理.这本身并不错,但有些情况下他们想要放弃处理并启动新流程,但他们被迫等待第一次请求完成.
由于ThreadPool.QueueUseWorkItem()不允许我取消线程,我试图想出一个更好的方法来排队工作,并且可能在我的类中使用显式的FlushQueue()方法来允许调用者放弃工作我的队列.
任何人都对符合我需求的线程模式有任何建议吗?
编辑:我目前正在瞄准2.0框架.我目前正在考虑使用Consumer / Producer队列.有没有人想过冲洗队列的想法?
编辑2问题澄清:
因为每次调用者使用Begin with Callback时我都在我的类中使用Begin / End模式,所以我在线程池上创建了一个全新的线程.此调用只进行了很少的处理,而不是我想取消的地方.这是我希望停止的队列中未完成的工作.
ThreadPool默认情况下每个处理器创建250个线程这一事实意味着如果您要求ThreadPool使用QueueUserWorkItem()对大量项进行排队,则最终会创建大量并发线程而无法停止.
由于我对线程进行排队的方式,调用者不仅可以将CPU推送到100%而且还可以创建工作.
我正在考虑使用Producer / Consumer模式,我可以将这些线程排入我自己的队列,这将允许我调整我创建的线程数,以避免CPU峰值创建所有并发线程.并且我可以允许我的类的调用者在放弃请求时刷新队列中的所有作业.
我目前正在尝试自己实现这一点,但我认为这是一个让别人说看看这个代码的好地方,否则你将无法冲洗因为这个或冲洗不是正确的术语你的意思.
最佳答案 编辑我的答案不适用,因为OP使用2.0.对于阅读此问题并使用4.0的任何人,请离开并切换到CW
如果您使用的是C#4.0,或者可以对早期版本的并行框架之一进行依赖,则可以使用它们的内置取消支持.它不像取消线程那么容易,但框架更可靠(取消线程非常有吸引力,但也非常危险).
里德做了一篇很好的文章,你应该看看