System.Collections.Concurrent.BlockingCollectionのサンプル
void Main()
{
Exec().Wait();
}
async Task Exec()
{
using(var bc = new BlockingCollection<string>())
{
await Task.WhenAll(ProduceAsync(bc), ConsumeAsync(bc)).ContinueWith((pt) =>
{
"=== THE END ===".Dump();
});
"Dispose BlockingCollection....".Dump();
}
}
Task ProduceAsync(BlockingCollection<string> bc)
{
return Task.Run(async () =>
{
await Task.WhenAll(AddAsync(bc, 1, 10, 250), AddAsync(bc, 250, 10, 300));
bc.CompleteAdding();
});
}
Task AddAsync(BlockingCollection<string> bc, int startNumber, int count, int delay)
{
return Task.Run(async () =>
{
foreach (var i in Enumerable.Range(startNumber, count))
{
bc.Add(string.Format("number {0:D3} : ThreadId={1:D2}", i, Thread.CurrentThread.ManagedThreadId));
await Task.Delay(delay);
}
});
}
Task ConsumeAsync(BlockingCollection<string> bc)
{
return Task.Run(() =>
{
foreach (var item in bc.GetConsumingEnumerable())
{
item.Dump();
}
});
}