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

标签 c# multithreading concurrency threadpool interrupt

假设我已经在 ThreadPool 中排队了一个工作项,但是如果没有数据要处理(从 BlockingQueue 读取),工作项就会阻塞。如果队列是空的,没有更多的工作进入队列,那么我必须调用Thread.Interrupt方法来中断阻塞任务,但是如何做同样的事情使用ThreadPool

代码可能是这样的:

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

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

最佳答案

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

没关系;很简单——我不会。您可以在线程生命周期的早期做一些事情来存储线程引用,但我根本不会将 ThreadPool 用于这项工作,因为它听起来运行时间更长。常规的 Thread 似乎更合适。

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

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

用这个:

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

关于C# 是否可以中断 ThreadPool 中的特定线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2430609/

相关文章:

multithreading - 协程可以挂起然后在不同的线程上恢复吗?第一个线程的内存效应是否会传递到第二个线程?

Python:报纸模块——有什么方法可以直接从 URL 获取文章?

java - 通过手动触发内存屏障来避免并发结构

sql-server - 如何在共享数据库上同时生成唯一的用户名?

java - 没有 happens-before 的安全发布?除了 final 还有什么?

c# - 使用 protobuf-net 反序列化完全未知的对象

c# - 有两把 key 的收藏

java - 使用Java线程从并发访问切换到顺序访问

c# - C#获取单个文件最近创建时间的路径

c# - Dot Net MemoryCache 逐出