我在C# in a Nutshell书籍的示例生产者消费者队列中复用了BlockingCollection(http://www.albahari.com/threading/part5.aspx#_BlockingCollectionT),但有同事问道:
“为什么在集合的Dispose中不调用BlockingCollection的Dispose呢?”
我找不到答案,唯一能想到的原因是队列剩余的工作负载将不被处理。然而,当我处置队列时,为什么它不会停止处理呢?
根据What does BlockingCollection.Dispose actually do?,BlockingCollection包含两个等待句柄(显然),所以不调用Dispose会给你带来一些问题。感谢ken2k指出这一点。
我谈论的代码:
我找不到答案,唯一能想到的原因是队列剩余的工作负载将不被处理。然而,当我处置队列时,为什么它不会停止处理呢?
根据What does BlockingCollection.Dispose actually do?,BlockingCollection包含两个等待句柄(显然),所以不调用Dispose会给你带来一些问题。感谢ken2k指出这一点。
我谈论的代码:
public class PCQueue : IDisposable
{
BlockingCollection<Action> _taskQ = new BlockingCollection<Action>();
public PCQueue (int workerCount)
{
// Create and start a separate Task for each consumer:
for (int i = 0; i < workerCount; i++)
Task.Factory.StartNew (Consume);
}
public void Dispose() { _taskQ.CompleteAdding(); }
public void EnqueueTask (Action action) { _taskQ.Add (action); }
void Consume()
{
// This sequence that we’re enumerating will block when no elements
// are available and will end when CompleteAdding is called.
foreach (Action action in _taskQ.GetConsumingEnumerable())
action(); // Perform task.
}
}