这是我的场景。我从外部数据源获取大量数据,我必须在两个地方本地写入。其中一个目的地的写入速度非常慢,但另一个目的地非常快(但我不能依靠它来读取和写入缓慢的目的地)。为此,我使用了生产者-消费者模式(使用 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();
    }
}