C# 在 ThreadPool 中是否有可能中断特定的线程?

3
假设我已经在 ThreadPool 中排队了一个工作项,但是如果没有数据要处理(从 BlockingQueue 读取),则工作项将被阻塞。如果队列为空,并且不会再有更多的工作进入队列,那么如果我想中断阻塞任务,就必须调用 Thread.Interrupt 方法,但如何在 ThreadPool 中执行相同的操作呢?
代码可能看起来像这样:
void Run()
{
    try
    {
        while(true)
        {
            blockingQueue.Dequeue();
            doSomething();
        }
    }
    finally
    {
        countDownLatch.Signal();
    }
}

我知道在这种情况下最好的做法是使用常规的Thread,但我想知道是否有一种与ThreadPool等价的方法来中断工作项。

1个回答

2

这是哪个BlockingQueue?是BCL类、TPL类还是自定义类?

无论如何,我不会这样做。你可以在线程的生命周期早期做一些事情来存储线程引用,但我不会使用ThreadPool完成这项任务,因为它听起来需要更长时间运行。一个常规的Thread似乎更加合适。

我也很惊讶没有内置方法告诉队列释放所有工作线程 - 我以前写过阻塞队列,并且我倾向于使用模式(例如:从这里):

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

使用以下方式:

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

一个非易失性布尔变量(closing)在短循环中测试,这总是有效的吗? - Hans Passant
@nobugz - 我相信 Monitor.Wait 会强制刷新;不过这是一个有趣的问题。 - Marc Gravell
锁定语句:是的,由于try块。Monitor.Wait()非常可疑。这需要JIT检测特定方法。 - Hans Passant
请注意,@nobugz,Wait 调用了 ObjWait,它是一个 internalcall,因此 JIT 并不完全掌控;但我可能会把这个问题公开提出。 - Marc Gravell
@nobugz - 在这里提出:https://dev59.com/snE95IYBdhLWcg3wKqok - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接