等待列表获取更新的C#

时间:2014-05-04 05:13:41

标签: c# .net multithreading

我有一个

List<object> listOfData;

在C#中,每隔X分钟从getDataBackgroundWorker获取数据。

我有另一个processDataBackgroundWorker等待来自listOfData的数据并对其进行处理。

如何确保我只从listOfData获取唯一数据(始终添加新数据)以及当{{1}中没有新数据时如何让processDataBackgroundWorker暂停}}?

1 个答案:

答案 0 :(得分:2)

List<> isn't a great choice in concurrency - 有开箱即用的替代方案,例如已为您完成了大量艰苦工作的ConcurrentBag, ConcurrentQueue

以下是生产者 - 消费者模式的实现,根据MSDN使用BlockingCollection实现,

  • BlockingCollection支持ConcurrentQueue,假设我们按顺序在消费者处依次提取数据。
  • 迭代BlockingCollection块(开销很小)直到项目可用的方法(即您的'暂停'是固有的 - 不需要在消费者上使用Thread.Sleep进行循环检查)。
  • 当制作人调用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);