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