我正在努力实现易于描述的内容,但我找不到如何。
我希望被阻止,直到列表中至少有一个元素。假设我们有两名工人。
Collection c;
工人1:
while(true) {
var element = c.waitOneElement();
// Do some stuff with element
}
工人2:
// Do some slow stuff
c.Add(element);
这可以使用信号量来完成,但我想知道是否有一个允许这种东西的内置类。
由于
编辑:或者,我可以将回调映射到“添加元素”事件,但我认为它不存在。
答案 0 :(得分:1)
使用.Net 4,您获得了Task Parallel Library。有了它,你可以找到System.Collections.Concurrent Namespace。在这里,您可以找到一些能够满足您的目标的集合。
答案 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方法会阻塞,直到集合中的项目为止。