集合类的需求总是源源不断,因此,不管是1.0到2.0的泛型,还是3.0到4.0 的并行(本文的并行指Concurrent,非 Parallel),.NET每个版本总会伴随着一些 集合类的增长。由于并行计算现在已经越来越流行,这里我将对.NET 4.0中新增 的命名空间System.Collections.Concurrent和它下面的类做一些简单的介绍。
为什么需要Concurrent?
相信不少朋友都有多线程编程的经历吧,不过在.NET 4.0以前,多线程编程 下很容易出问题,先看个简单的例子吧。
static void main()
{
myList = new List<string>();
for (int i = 0; i < 1000; i++)
{
myList.Add(i.ToString());
}
new Thread(T2).Start();
new Thread(T3).Start();
}
static IList<string> myList;
static void T2()
{
Thread.Sleep(100);
for (int i = 0; i < 50; i++)
{
myList.Remove(i.ToString());
}
}
static void T3()
{
foreach (var a in myList)
{
Console.WriteLine(a);
}
}
在这个例子中,我们首先初始化一个长度为1000数组,然后我们开启两个线 程,一个进行删除操作,另外个则进行简单的读操作。运行代码的话你会发现程 序会抛出InvalidOperationException,因为系统集合在被读的同时被修改了,因 此列举操作可能不能执行。
当然在4.0以前我们也有办法避免这种类似的操作,比如我们可以对要操作的 对象加锁。即我们可以在对myList集合进行读写操作之前对其添加代码lock (myList)。
然而这种方式毕竟不够简洁,并且在更复杂的情况下它可能会显得非常繁琐 。这时候支持并行操作的集合应运而生了。