これが私のシナリオです。外部データ ソースから大量のデータを取得しており、ローカルの 2 か所に書き込む必要があります。宛先の1つは書き込みが非常に遅いですが、もう1つは超高速です(ただし、低速の宛先への読み取りと書き込みには依存できません)。これを実現するために、私は Producer-Consumer パターン (BlockingCollection を使用) を使用しています。
私が今抱えている問題は、2 つの BlockingCollection でデータをキューに入れる必要があり、それがあまりにも多くのメモリを消費することです。私のコードは以下の例と非常によく似ていますが、1 つのキューから 2 つのタスクを実行したいと考えています。それを行う適切な方法を知っている人はいますか?以下のコードに非効率性はありますか?
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();
}
}