这是我的场景。我从外部数据源获取大量数据,我必须在两个地方本地写入。其中一个目的地的写入速度非常慢,但另一个目的地非常快(但我不能依靠它来读取和写入缓慢的目的地)。为此,我使用了生产者-消费者模式(使用 BlockingCollection)。
我现在遇到的问题是我必须在两个 BlockingCollection 中对数据进行排队,这会占用太多内存。我的代码看起来与下面的示例非常相似,但我真的很想从一个队列中驱动两个任务。有谁知道这样做的正确方法是什么?下面的代码效率低下吗?
class Program
{
const int MaxNumberOfWorkItems = 15;
static BlockingCollection<int> slowBC = new BlockingCollection<int>(MaxNumberOfWorkItems);
static BlockingCollection<int> fastBC = new BlockingCollection<int>(MaxNumberOfWorkItems);
static void Main(string[] args)
{
Task slowTask = Task.Factory.StartNew(() =>
{
foreach (var item in slowBC.GetConsumingEnumerable())
{
Console.WriteLine("SLOW -> " + item);
Thread.Sleep(25);
}
});
Task fastTask = Task.Factory.StartNew(() =>
{
foreach (var item in fastBC.GetConsumingEnumerable())
{
Console.WriteLine("FAST -> " + item);
}
});
// Population two BlockingCollections with the same data. How can I have a single collection?
for (int i = 0; i < 100; i++)
{
while (slowBC.TryAdd(i) == false)
{
Console.WriteLine("Wait for slowBC...");
}
while (fastBC.TryAdd(i) == false)
{
Console.WriteLine("Wait for 2...");
}
}
slowBC.CompleteAdding();
fastBC.CompleteAdding();
Task.WaitAll(slowTask, fastTask);
Console.ReadLine();
}
}