.NET多线程

.NET多线程(十)并发集合

2017-01-20  本文已影响0人  万州大牛

** 集合,BlockingCollection,Dictionary,ConcurrentDictionary,ReadOnlyDictionary **

字典集合

(1)ConcurrentDictionary
适用多线程,高并发读写模式

(2)Dictionary
适用单线程读写模式,或者并发可能性非常小的情况

for (int i = 0; i < 1000000; i++)
{
    lock (dictionary) // 单线程无需LOCK
    {
        dictionary.Add(i, "test");
    }
}

(3)ReadOnlyDictionary
适用单线程,多线程只读模式

System.Collections.Concurrent.BlockingCollection

场景,生产消费模式

在消费这个集合的时候,是等待阻塞的
如果需要在消费这个集合的时候,不用等待呢?
简单的例子,如果 UI 是消费线程, UI 线程不可能通过等待的方式去处理队列里的项
详见,异步队列

初见 TPL Dataflow library


private static readonly BlockingCollection<int> blockQueue = new BlockingCollection<int>();

Task.Factory.StartNew(() =>
{
    int num = 10;
    while (num > 0)
    {
        blockQueue.Add(num);
        num = num - 1;
        Thread.Sleep(1 * 1000);
    }
    //blockQueue.CompleteAdding(); // 标志完成
});
//blockQueue.Add(3); // 标志完成,不能再添加
//blockQueue.Take(); // 消费1个
foreach (int num in blockQueue.GetConsumingEnumerable()) // 集合未标志完成,则会阻塞
{
    Console.WriteLine(num);
    Thread.Sleep(2 * 1000);
}
Console.WriteLine(blockQueue.Count); // 消费后,就移除
Console.ReadLine();
上一篇下一篇

猜你喜欢

热点阅读