List<>
isn't a great choice in concurrency - 有很多可以替代的东西,比如ConcurrentBag, ConcurrentQueue
,这些东西已经为您完成了很多辛苦的工作。
这里的生产者 - 消费者模式的实现,使用BlockingCollection
实现按MSDN,
- 的
BlockingCollection
备份与ConcurrentQueue
,假设我们被连续提取数据,按顺序对消费者。
- 方法重复
BlockingCollection
块(很少有开销),直到一个项目可用(即您的'暂停'是固有的 - 不需要与消费者上的Thread.Sleep
s循环检查。
- 终止本质上是内置的,当制片人呼吁
CompletedAdding
- 如果你有一个以上的并发(竞争)的消费者中,只有一个消费者将获得一个项目,即重复条件不应该是一个问题(除非你意味着生产者实际上首先增加了重复项)。
var queue = new BlockingCollection<string>(new ConcurrentQueue<string>());
var producer = Task.Factory.StartNew(() =>
{
queue.Add("Hello!");
Thread.Sleep(1000);
queue.Add("World!");
Thread.Sleep(2000);
Enumerable.Range(0, 100).ToList().ForEach(x => queue.Add(x.ToString()));
queue.CompleteAdding();
});
var consumer = Task.Factory.StartNew(() =>
{
while (!queue.IsCompleted)
{
try
{
Debug.WriteLine(queue.Take());
}
catch (InvalidOperationException)
{
}
}
});
Task.WaitAll(producer, consumer);
感谢您的解决方案,我用ConcurrentBag,它为我工作。以上是另一种选择。 – circler