C#是否可以中断ThreadPool中的特定线程?
假设我在ThreadPool
排队了一个工作项,但是如果没有要处理的数据,则工作项会阻塞(从BlockingQueue
读取)。 如果队列为空并且没有更多的工作进入队列,那么如果我想中断阻塞任务,我必须调用Thread.Interrupt
方法,但是如何使用ThreadPool
做同样的事情?
代码可能如下所示:
void Run() { try { while(true) { blockingQueue.Dequeue(); doSomething(); } } finally { countDownLatch.Signal(); } }
我知道在这种情况下最好的办法是使用常规的Thread
,但我想知道是否有一个ThreadPool
等效方法来中断工作项。
哪个BlockingQueue
是那个? 那是BCL课吗? TPL课程? 还是定制的?
不管; 简单 – 我不会。 你可以在线程的生命早期做一些事情来存储线程引用,但我根本不会使用ThreadPool
来完成这项工作,因为它听起来像是运行时间更长。 常规Thread
似乎更合适。
我也很惊讶没有内置方法告诉队列释放所有工作者 – 我之前编写了阻塞队列,我倾向于使用该模式(例如, 从这里 ):
public bool TryDequeue(out T value) {...}
有了这个:
- 如果有数据,立即返回true
- 如果没有数据但是添加了一些数据,则阻塞和(最终)返回true
- 如果队列正在关闭,则阻塞并(最终)返回false