在线程中启动作业从其他线程的队列中读取

时间:2015-02-06 12:11:39

标签: c# .net multithreading

我有一个我无法弄清楚的问题。这可能不容易解释。

我有一个带有这个私有构造函数的单例类:

private BarcodeMonitor()
{
    processors[Machines.H1] = new BarcodeProcessor { Queue = new BlockingQueue<BarcodeData>("H1") };
    processors[Machines.H2] = new BarcodeProcessor { Queue = new BlockingQueue<BarcodeData>("H2") };
    processors[Machines.M] = new BarcodeProcessor { Queue = new BlockingQueue<BarcodeData>("M") };
    processors[Machines.HP] = new BarcodeProcessor { Queue = new BlockingQueue<BarcodeData>("HP") };

    foreach (KeyValuePair<Machines, BarcodeProcessor> pair in processors)
    {
        Thread t = new Thread(t1 => pair.Value.StartProccesingQueue());
        t.Name = pair.Key.ToString() + "Processor";
        t.Start();
        threads.Add(t);
    }
}

BlockingQueue提供了一个新的唯一BarcodeProcessor并取名。

BarcodeMonitor有这种方法:

public BlockingQueue<BarcodeData> GetQueue(Machines machine)
{
    var processor = processors[machine];
    return processor.Queue;
}

以便将传入的条形码放入正确的机器的队列中。这很好。

条形码在StartProccesingQueue()中出列(其中4个实例正在运行)。在出列方法中,我有:

System.Console.WriteLine(string.Format("Thread {0} is taking from queue {1}", Thread.CurrentThread.Name, name));
当队列为空时,

Dequeue()使用Monitor.Wait(_internalQueue)Enqueue()使用Monitor.PulseAll(_internalQueue)继续等待队列。

正在发生的是StartProccesingQueue()方法从其他队列获取,即使它只访问分配有新Queue的{​​{1}}属性。事实上,到目前为止,我只看到了队列中的项目&#34; M&#34;被采取,只有H1和H2线程正在这样做。

我真的不明白为什么会这样。

1 个答案:

答案 0 :(得分:0)

好吧,我对此并不十分肯定,但我认为当您执行pulseAll(_internalQueue)时,所有等待的线程都会注意到_internalQueue现已准备就绪,请参阅MSDN PulseAll() 。 也许只试试pulse(_internalQueue)这应该只通知等待_internalQueue的主题,请参阅MSDN pulse()