我有一个使用阻止集合的类:
public class MessageQueue : IDisposable
{
private BlockingCollection<Message> queue;
private MessageHandler messageHandler;
private CancellationToken cancellationToken;
public MessageQueue(MessageHandler handler, CancellationToken cancellationToken)
{
this.messageHandler = handler;
this.cancellationToken = (cancellationToken != null) ? cancellationToken : new CancellationToken();
for (int i = 0; i < Environment.ProcessorCount; i++)
{
Task.Factory.StartNew(() => DequeueMessage());
}
}
public void Enqueue(Message message)
{
queue.Add(message);
}
private void DequeueMessage()
{
Message message;
while (!cancellationToken.IsCancellationRequested)
{
if (queue.TryTake(out message, 5000, cancellationToken))
{
messageHandler.Handle(message);
}
}
}
}
只要所有消费者线程正确地开始使消息出列,消息被排队,并且所有线程将其第一条消息从队列中取出并开始处理,所有看起来都很好。但是,之后只有一个线程继续处理消息。所有其他线程似乎都去线程池做其他事情。我有一个登录dequeue方法的日志,它会记录退出该方法的线程 - 没有一个线程记录它。我没想到这一点,我感到困惑。这种行为是否有一个很好的解释,我不理解?