我有一个
List<object> listOfData;
在C#中,每隔X分钟从getDataBackgroundWorker
获取数据。
我有另一个processDataBackgroundWorker
等待来自listOfData
的数据并对其进行处理。
如何确保我只从listOfData
获取唯一数据(始终添加新数据)以及当{{1}中没有新数据时如何让processDataBackgroundWorker
暂停}}?
答案 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);