2011-02-18 37 views
1

我想實現一些容易描述的東西,但我找不到如何。列表/收藏被阻止,直到其填充

我想被阻止,直到列表中至少有一個元素。假設我們有兩名工人。

Collection c; 

工人1:

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

工人2:

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

這可以利用信號燈來實現,但我不知道是否有一個內置的類,允許種類的東西。

感謝

編輯:另外,我可以回調映射到一個「元素添加」事件,但我不認爲它的存在。

+0

嗨,如果你使用可觀察的集合,你的回調會在集合發生變化時被調用,並且只有當至少有一個元素出現時纔會執行某些操作。我會避免鎖定和信號量。 – 2011-02-18 12:02:32

回答

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

請注意,在採集食用方法塊,直到那裏有一個項目。

+0

正是我在找的東西。謝謝! – Jonas 2011-02-18 14:33:39