devlights
3/3/2015 - 5:32 AM

System.Collections.Concurrent.BlockingCollectionのサンプル

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();
        }
    });
}