列表/集合被阻止直到填满

时间:2011-02-18 11:52:59

标签: c# multithreading semaphore

我正在努力实现易于描述的内容,但我找不到如何。

我希望被阻止,直到列表中至少有一个元素。假设我们有两名工人。

Collection c;

工人1:

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

工人2:

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

这可以使用信号量来完成,但我想知道是否有一个允许这种东西的内置类。

由于

编辑:或者,我可以将回调映射到“添加元素”事件,但我认为它不存在。

2 个答案:

答案 0 :(得分:1)

使用.Net 4,您获得了Task Parallel Library。有了它,你可以找到System.Collections.Concurrent Namespace。在这里,您可以找到一些能够满足您的目标的集合。

也许您还应该查看文档Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4

答案 1 :(得分:1)

您可以在此处阅读此类合集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方法会阻塞,直到集合中的项目为止。