.NET BlockingCollection但只有一个线程处理消息

时间:2016-03-29 19:59:40

标签: c# .net multithreading blockingcollection

我有一个使用阻止集合的类:

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方法的日志,它会记录退出该方法的线程 - 没有一个线程记录它。我没想到这一点,我感到困惑。这种行为是否有一个很好的解释,我不理解?

0 个答案:

没有答案