Список / Коллекция заблокирована до ее заполнения - PullRequest
1 голос
/ 18 февраля 2011

Я пытаюсь найти что-то простое для описания, но не могу найти, как.

Я хочу быть заблокированным, пока в списке не будет хотя бы один элемент.Допустим, у нас есть два рабочих.

Collection c;

Рабочий 1:

while(true) {
  var element = c.waitOneElement();
  // Do some stuff with element
}

Рабочий 2:

// Do some slow stuff
c.Add(element);

Это можно сделать с помощью семафоров, но яМне интересно, есть ли встроенный класс, который допускает такие вещи.

Спасибо

Редактировать: В качестве альтернативы, я мог бы сопоставить обратный вызов с событием "Добавлен элемент", но я нене думаю, что он существует.

Ответы [ 2 ]

1 голос
/ 18 февраля 2011

Вы можете прочитать о таких коллекциях здесь http://www.albahari.com/threading/part5.aspx#_Concurrent_Collections

, и вот фрагмент кода с этой страницы, который вам может понравиться

   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.
      }
    }

Обратите внимание, что метод Consume блокируется до тех пор, пока элемент в коллекции.

1 голос
/ 18 февраля 2011

С .Net 4 вы получаете Task Parallel Library .С этим вы можете найти System.Collections.Concurrent Namespace .Здесь вы найдете несколько коллекций, которые способны на то, что вы пытаетесь сделать.

Может быть, вам также следует взглянуть на документ Шаблоны для параллельного программирования: понимание и применение параллельных шаблонов с помощью.NET Framework 4 .

...