2014-05-04 39 views
1

我有一个用C等待列表以获取更新C#

List<object> listOfData; 

#是获取数据从一个getDataBackgroundWorker每隔X分钟。

我有另一个processDataBackgroundWorker,它等待从listOfData的数据并处理它。

如何确保我只从listOfData(总是添加新数据)获取唯一数据,以及如何在listOfData中没有新数据时请求processDataBackgroundWorker暂停?

回答

2

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); 
+0

感谢您的解决方案,我用ConcurrentBag,它为我工作。以上是另一种选择。 – circler