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