C#是否可以中断ThreadPool中的特定线程?

时间:2010-03-12 05:03:12

标签: c# multithreading concurrency threadpool interrupt

假设我已将ThreadPool中的工作项排队,但如果没有要处理的数据,则工作项会阻止(从BlockingQueue读取)。如果队列是空的并且没有更多的工作进入队列,那么如果我想中断阻塞任务,我必须调用Thread.Interrupt方法,但是如何用{{1来执行相同的操作}}?

代码可能如下所示:

ThreadPool

我知道在这种情况下最好的办法是使用常规void Run() { try { while(true) { blockingQueue.Dequeue(); doSomething(); } } finally { countDownLatch.Signal(); } } ,但我想知道是否有一种Thread等效的方式来中断工作项。

1 个答案:

答案 0 :(得分:2)

是哪个BlockingQueue?那是BCL课吗? TPL课程?还是定制?

无论如何;简单 - 我不会。你可以在线程生命的早期做一些事情来存储线程引用,但我根本不会使用ThreadPool来完成这项工作,因为它听起来更长时间运行。常规Thread似乎更合适。

我也很惊讶没有内置方法告诉队列释放所有工作人员 - 我之前编写了阻塞队列,我倾向于使用该模式(例如,from here):

public bool TryDequeue(out T value) {...}

用这个:

  • 如果有数据则立即返回
  • 阻止并且(最终)如果没有数据但是添加了一些数据则返回
  • 阻止并且(最终)在队列关闭时返回false