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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csharp 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();
        }
    });
}

以上是关于csharp System.Collections.Concurrent.BlockingCollectionのサンプル的主要内容,如果未能解决你的问题,请参考以下文章

csharp 集合的并发,避免使用传统的锁(lock)机制等方式来处理并发访问集合。因此当有多个线程并发访问集合时,应首先考虑使用这些类代替System.Collections和System.Coll

配置文件——WebApp.config文件读取和修改

模仿ICE的structured panorama小按钮

System.Collections.Generic vs System.Collections? [复制]

获取 System.Collections.Generic.List1[System.Collections.Generic.KeyValuePair2[System.Int32,System.Str

参数 1:无法从 'System.Collections.Generic.List' 转换为 'System.Collections.Generic.List'