`
pcajax
  • 浏览: 2185226 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

.NET 4.0新增命名空间:System.Collections.Concurrent

阅读更多
集合类的需求总是源源不断,因此,不管是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)。

 

然而这种方式毕竟不够简洁,并且在更复杂的情况下它可能会显得非常繁琐。这时候支持并行操作的集合应运而生了。

  有哪些Concurrent集合?

  在System.Collections.Concurrent公开的类并不多,他们分别在两个不同的dll中存在,其中在System.dll中仅仅一个BlockingCollection<T>和ConcurrentBag<T>,在mscorlib.dll中则稍多一些,他们分别是ConcurrentQueue<T>, ConcurrentStack<T>, ConcurrentDictionary<TKey, TValue>。不过对于日常开发来说,他们基本够用。下面我们来一个个看下这些类的构造吧。

  首先看看mscorlib中的几个类,这些类其实我们在.NET 2.0中已经接触过它们的普通版本,因此它们功能基本不变,因此你仍然可以像以前那样使用普通版本的哈希表,队列和堆栈来使用它们。

  不过并行类不仅仅简单以前的集合类改造成线程安全的并行类,它同时还提供了一些更丰富的功能,由于Lamda表达式的引入,现在在 ConcurrentDictionary<TKey, TValue>你可以通过AddOrUpdate或GetOrAdd添加自己的值生成方案。这使得我们在生成键值对的时候更加方便和简单了。如:

ConcurrentDictionary<int, string> td = new ConcurrentDictionary<int, string>();
Func<int, string> genVar = (i) => i.ToString();
Task.Factory.StartNew(() =>
{
  for (int i = 0; i < 1000; i++)
  {
    td.GetOrAdd(i, genVar);
  }
});
Task.Factory.StartNew(() =>
{
  Func<int, string, string> updateVar = (key, oldVar) => oldVar + key;
  td.AddOrUpdate(0, genVar, updateVar);
  Console.WriteLine(td[0]);
}).Wait(); 

我们可以看到,现在我们在取值的时候,如果哈希表中没有该值的话我们可以自己生成,或者我们在添加新的值的时候如果碰到重复键值的时候也可以很方便的解决掉了。相对以前在添加或者查找数据时痛苦的判断,这种方式更加简洁和方便。

  其他几个类相对来说函数使用变化不大,唯一区别比较大的也是在Concurrent命名空间中很常见的各种try函数操作。

  接着我们来看看在System.dll中的并行集合,这里面的两个类在以前的.NET中是没有的。首先看看 ConcurrentBag<T>,顾名思义,这个类提供并行数据包的功能,这个类相对来说构造比较简单,它继承自四个接口:IProducerConsumerCollection<T>, IEnumerable<T>, ICollection, IEnumerable,后面三个集合类常用的接口我们当然很熟悉,而且由于实现了IEnumerable<T>接口,ConcurrentBag<T>也支持LINQ操作。不过这里有个特殊的接口 IProducerConsumerCollection<T>我们以前没有见过,虽然是个新的接口,但故名思意,这个接口提供了生产者/消费者的集合操作,它提供了四个基本的方法:CopyTo(T[],int), ToArray(), TryAdd(T), TryTake(out T)。其中我们主要关注后面的两个方法,TryAdd是添加元素操作,而TryTake则是取元素操作。不过在ConcurrentBag 中,TryAdd方法被设置为protected,外部对象需要通过Add操作来添加元素。另外,取元素的话,除了TryTake之外,我们还可以通过 TryPeek来取集合当前的最后一个元素而不删除它。下面来看看例子:

static void main()
{
  ConcurrentBag<string> bag = new ConcurrentBag<string>();
  Task.Factory.StartNew(() =>
  {
    for (int i = 0; i < 1000; i++)
    {
      bag.Add(i.ToString());
    }
    bag.Add("Last");
  });
  Task.Factory.StartNew(() =>
  {
    foreach (string item in bag)
    {
      Console.WriteLine(item);
    }
  }).Wait();
} 

  BlockingCollection<T>相对来说,要稍微复杂一些,它实现了四个接口:IEnumerable<T>, ICollection, IEnumerable, IDisposable,因此该集合同样支持LINQ,不仅如此,它也提供了比ConcurrentBag更加丰富的功能。如 CompleteAdding和超时设置的TryAdd和TryTake方法等等。

  总结

  随着多线程和并行编程的要求越来越多,相信在未来,.NET家族新增的这些类将会在我们的日常编程生活中越来越常见,所以掌握它们也显得越来越又必要了。

分享到:
评论

相关推荐

    Microsoft.NET.4.0..rar

    3. **并行计算**:新增的Task Parallel Library(TPL)和Concurrent Collections等工具,使开发者能够轻松地利用多核处理器进行并行计算,提高应用的计算性能。 4. **动态语言支持**:引入了Dynamic Language ...

    C#与.NET 4.0高级程序设计(中+英)

    5. **.NET框架类库**:学习常用的类库,如System.IO(文件和流操作)、System.Net(网络通信)、System.Collections.Generic(集合操作)等。 6. **Windows Forms和WPF**:了解和创建桌面应用程序,包括UI设计、...

    Professional C#4.0 and .NET 4.0 part2

    Chapter 23: System.Transactions . . . . . . . . . . . . . . . . . . . . . . . . . .605 Chapter 24: Networking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637 Chapter 25: Windows ...

    Professional C# 4.0 and .NET 4.0 part1

    Chapter 23: System.Transactions . . . . . . . . . . . . . . . . . . . . . . . . . .605 Chapter 24: Networking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637 Chapter 25: Windows ...

    Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.Transformer异常

    在这个特定的场景中,异常堆栈跟踪显示了 `Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.Transformer`,这表明系统无法找到 `org.apache.commons.collections.Transformer` 类。...

    JMeterPlugins.jar

    class : org.apache.jorphan.collections.ListedHashTree required-type : org.apache.jorphan.collections.ListedHashTree converter-type : org.apache.jmeter.save.converters.HashTreeConverter path : /...

    .NET Framework 4.0 常用类库参考手册 [微软官方 MSDN]

    MSDN Library - .NET Framework 4.0 - 命名空间 (节选版) 制作成了chm格式,方便离线状态下学习! ======================================= 原文地址:http://msdn.microsoft.com/zh-cn/library/ms229335.aspx ==...

    java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方案

    1. **commons-collections-3.2.1.jar**:这是Apache Commons Collections库,提供了许多实用的集合框架扩展,包括一些辅助类和算法,DBCP依赖于这个库来执行一些功能。 2. **commons-dbcp-1.2.1.jar**:这是Apache ...

    .NET Programming with Visual C++: Tutorial, Reference, and Immediate Solutions

    .NET Programming with Visual C++: Tutorial, Reference, and Immediate Solutions By 作者: Max Fomitchev ISBN-10 书号: 1138436399 ISBN-13 书号: 9781138436398 Edition 版本: 1 出版日期: 2017-07-27 Pages:...

    NET+Framework+4.0+常用类库参考手册(节选)

    2. **System.Collections** 和 **System.Collections.Generic**:这两个命名空间提供了多种数据结构,如ArrayList、Hashtable(非泛型)和List、Dictionary, TValue&gt;(泛型)。泛型集合增强了类型安全性和性能。 3....

    C#关于System.Collections空间详解

    C#的System.Collections命名空间包含可使用的集合类和相关的接口,提供了集合的基本功能。包括了.NET下的非泛型集合类以及非泛型接口等,现详述如下: 该命名空间下的.NET非泛型集合类如下所示: — System....

    C# System.Collections 非泛型接口方法解析.pdf

    在C#编程中,System.Collections命名空间包含了许多非泛型集合接口,这些接口是.NET框架早期版本的基础,尽管现在泛型集合接口(如`IEnumerable&lt;T&gt;`)更为常用,但理解非泛型接口对于维护旧代码或处理特定场景仍然很...

    .NET Framework 4.0 API 架构图

    7. **集合** - System.Collections和System.Collections.Generic命名空间提供了各种集合类,如List、Dictionary, TValue&gt;等,用于存储和管理对象群组。 8. **I/O和内存** - 包括System.IO和System.IO.MemoryMapped...

    NHibernate3.2及Iesi.Collections的dll文件

    1. **版本升级**:NHibernate 3.2相对于之前的版本,引入了若干性能优化和功能增强,比如改进的缓存策略、更好的SQL生成器以及对.NET Framework 4.0的全面支持。 2. **对象关系映射**:ORM是NHibernate的核心特性,...

    列举系统中的环境变量,listView1,System.Collections.DictionaryEntry EnValue in Environment.GetEnvironmentVariables()C#源代码

    列举系统中的环境变量,listView1,System.Collections.DictionaryEntry EnValue in Environment.GetEnvironmentVariables()C#源代码 用VisualStudio2008创建

    com.unity.collections@0.9.0-preview.6.7z

    6. **Unity.Collections.meta** 和 **Unity.Collections.Tests.meta**:分别代表Unity.Collections库的元数据文件和测试相关的元数据文件,后者可能包含了一些用于验证库功能的单元测试。 综上所述,这个压缩包包含...

    C# System.Collections所有对象的类图,结构图

    System.Collections导图,不含泛型(泛型与非泛型基本一致)

    commons-collections4-4.1-API文档-中文版.zip

    赠送jar包:commons-collections4-4.1.jar; 赠送原API文档:commons-collections4-4.1-javadoc.jar; 赠送源代码:commons-collections4-4.1-sources.jar; 赠送Maven依赖信息文件:commons-collections4-4.1.pom;...

    net Framework下的命名空间.docx

    10. System.Collections.Specialized:这个命名空间提供了特殊类型的集合,如LinkedListDictionary和StringCollection,满足特定的存储需求。 11. System.ComponentModel:包含了组件和控件运行时和设计时行为的...

    Csharp.6.0.and.the.NET.4.6.Framework.7th.Edition.1484213335.epub

    This new 7th edition of Pro C# 6.0 and the .NET 4.6 Platform has been completely revised and rewritten to reflect the latest changes to the C# language specification and new advances in the .NET ...

Global site tag (gtag.js) - Google Analytics