Вызов Dispose для BlockingCollection

Я повторно использовал пример очереди потребителя производителя из C # в Краткой книге Альбахари ( http://www.albahari.com/threading/part5.aspx# _BlockingCollectionT ) и коллега отметили: «Почему Dispose не вызывается для BlockingCollection в Dispose коллекции?»

Я не мог найти ответа, и единственная причина, по которой я могу придумать, - это то, что выполнение оставшейся рабочей нагрузки очереди не будет ' т быть обработанным. Однако, когда я удаляю очередь, почему бы не прекратить обработку?

Помимо вопроса «Почему не следует удалять BlockingCollection?» У меня также есть второй вопрос: «Вредно ли, если вы не избавитесь от BlockingCollection?». Я полагаю, когда вы создаете / удаляете множество очередей потребителей-производителей, это создает проблемы (не то чтобы я этого хотел, а просто для того, чтобы знать). Согласно Что на самом деле делает BlockingCollection.Dispose? BlockingCollection содержит два дескриптора ожидания (очевидно), поэтому отказ от вызова Dispose вызовет некоторые проблемы. Спасибо ken2k за указание на это.

Код, о котором я говорю:

public class PCQueue : IDisposable
{
  BlockingCollection _taskQ = new BlockingCollection(); 
  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.
  }
}

10
задан Community 23 May 2017 в 12:08
поделиться