用于并行编程的数据结构

.NET 提供了多种在并行编程中有用的类型,包括一组并发集合类、轻型同步基元和延迟初始化类型。 可以将这些类型与任何多线程应用程序代码一起使用,包括任务并行库和 PLINQ。

并发回收类

命名空间中的 System.Collections.Concurrent 集合类提供线程安全的添加和删除操作,尽可能避免锁,并在需要锁的情况下使用细粒度锁定。 并发集合类在访问项时不需要用户代码获取任何锁。 如果多个线程在回收中添加和删除项,并发回收类可以显著提高 System.Collections.ArrayListSystem.Collections.Generic.List<T>(具有用户实现的锁定)等类型的性能。

下表列出了并发集合类:

类型 DESCRIPTION
System.Collections.Concurrent.BlockingCollection<T> 为实现 System.Collections.Concurrent.IProducerConsumerCollection<T> 的线程安全集合提供阻塞和限制功能。 如果没有槽可用或回收已满,阻止制作者线程。 如果集合为空,使用者线程会阻止。 此类型还支持消费者和生产者的非阻塞访问。 BlockingCollection<T> 可用作基类或后盾存储,为支持 IEnumerable<T>的任何集合类提供阻塞和绑定。
System.Collections.Concurrent.ConcurrentBag<T> 提供可缩放的添加和获取操作的线程安全包实现。
System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> 并发和可缩放的字典类型。
System.Collections.Concurrent.ConcurrentQueue<T> 并发且可缩放的 FIFO 队列。
System.Collections.Concurrent.ConcurrentStack<T> 并发且可缩放的 LIFO 堆栈。

有关详细信息,请参阅 Thread-Safe 集合

同步基元

命名空间中的 System.Threading 同步基元通过避免在旧式多线程代码中找到昂贵的锁定机制,实现了精细的并发性和更快的性能。

下表列出了同步类型:

类型 DESCRIPTION
System.Threading.Barrier 通过设定一个点,每个任务可以在此发出信号以表示到达,然后阻塞线程,直到某些或所有任务到达,这样可以让多个线程并行处理算法。 有关详细信息,请参阅 “屏障”。
System.Threading.CountdownEvent 通过提供简单的回收机制,简化分支和联接方案。 有关详细信息,请参阅 CountdownEvent
System.Threading.ManualResetEventSlim 类似于 System.Threading.ManualResetEvent. 的同步基元。 ManualResetEventSlim 较轻,但只能用于进程内通信。
System.Threading.SemaphoreSlim 一个同步基元,用于限制可以同时访问资源或资源池的线程数。 有关详细信息,请参阅 Semaphore 和 SemaphoreSlim
System.Threading.SpinLock 互斥锁基元,导致尝试获取锁的线程先在循环中等待或旋转一段时间,再生成量程。 在等待锁预计较短的情况下, SpinLock 提供比其他形式的锁定更好的性能。 有关详细信息,请参阅 SpinLock
System.Threading.SpinWait 一种小型轻型类型,它将在指定时间内旋转,如果旋转计数超出,则最终线程将被置于等待状态。 有关详细信息,请参阅 SpinWait

有关详细信息,请参见:

迟缓初始化类

在使用延迟初始化时,只有在需要时才会分配对象的内存。 延迟初始化可以通过在程序的生存期内均匀分布对象分配来提高性能。 可以通过包装 Lazy<T>类型来为任何自定义类型启用延迟初始化。

下表列出了延迟初始化类型:

类型 DESCRIPTION
System.Lazy<T> 提供轻量级、线程安全的惰性初始化。
System.Threading.ThreadLocal<T> 为每个线程提供一个惰性初始化的值,每个线程都会惰性地调用初始化函数。
System.Threading.LazyInitializer 提供静态方法,以便无需分配一个专用的延迟初始化实例。 相反,它们使用引用来确保目标在访问时已初始化。

有关详细信息,请参阅 延迟初始化

聚合异常

System.AggregateException 类型可用于捕获在单独的线程上并发引发的多个异常,并将其作为单个异常返回到联接线程。 System.Threading.Tasks.TaskSystem.Threading.Tasks.Parallel类型以及 PLINQ 广泛地使用AggregateException以实现此目的。 有关详细信息,请参阅 异常处理作方法:处理 PLINQ 查询中的异常

另请参阅