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

C#是否可以中断线程池中的特定线程?,c#,multithreading,concurrency,threadpool,interrupt,C#,Multithreading,Concurrency,Threadpool,Interrupt,假设我在线程池中将一个工作项排入队列,但如果没有数据要处理,则该工作项将阻塞(从阻塞队列读取)。如果队列是空的,并且队列中没有更多的工作,那么如果我想中断阻塞任务,我必须调用线程.Interrupt方法,但是如何使用线程池做同样的事情呢 代码可能如下所示: void Run() { try { while(true) { blockingQueue.Dequeue(); doSomething();

假设我在
线程池
中将一个工作项排入队列,但如果没有数据要处理,则该工作项将阻塞(从
阻塞队列
读取)。如果队列是空的,并且队列中没有更多的工作,那么如果我想中断阻塞任务,我必须调用
线程.Interrupt
方法,但是如何使用
线程池做同样的事情呢

代码可能如下所示:

void Run()
{
    try
    {
        while(true)
        {
            blockingQueue.Dequeue();
            doSomething();
        }
    }
    finally
    {
        countDownLatch.Signal();
    }
}

我知道在这种情况下最好使用一个常规的
线程,但我想知道是否有一个
线程池
等效的方法来中断一个工作项。

哪个
阻塞队列
?那是BCL课程吗?第三方物流类?还是习俗

不要紧;简单地说,我不会。您可以在线程生命的早期做一些事情来存储线程引用,但我不会将
ThreadPool
用于此作业,因为听起来它运行的时间更长。常规的
线程
似乎更合适

我还感到惊讶的是,没有内置的方法告诉队列释放所有工作人员——我以前写过阻塞队列,我倾向于使用这种模式(例如,):

为此:

  • 如果有数据,立即返回true
  • 如果没有数据但添加了一些数据,则阻塞并(最终)返回true
  • 如果队列正在关闭,则阻塞并(最终)返回false

一个在短循环中测试的非易失性布尔变量(关闭),是否总是有效?@nobugz-我相信
监视器。Wait
将强制刷新;有趣的问题。锁声明:是的,由于try阻塞。Monitor.Wait(),非常可疑。它需要JIT检测特定的方法。@nobugz注意,
Wait
调用
ObjWait
,这是
internalcall
,因此它并不完全取决于JIT;但我可能会把这当作一个问题来讨论。@nobugz-在这里提出:
public bool TryDequeue(out T value) {...}