2

我有System.Collections.Generic.List _myList很多线程可以从中读取或同时向其中添加项目。从我读过的内容来看,我应该使用“BlockingCollection”,这样就可以了。我还阅读了ReaderWriterLockSlimand lock,但我不知道如何使用它们而不是BlockingCollection,所以我的问题是我可以这样做:

  1. ReaderWriterLockSlim

而不是使用“BlockingCollection”。BlockingCollection如果是,您能否提供简单的示例以及使用, ReaderWriterLockSlim,的优缺点lock

更新 的读者将不仅仅是作家!

4

2 回答 2

5

ReaderWriterLockSlim

  • 针对用例进行了优化,当从资源中读取比写入更频繁时;
  • 可以使用任何类型的资源(不仅是集合),因为它只是一个混合同步结构。

lock

  • 是一种通用的、相当简单的混合同步结构,没有任何优化;因此,会使性能变差;
  • 是类的 C# 包装器Monitor
  • 可以使用任何类型的资源;

BlockingCollection

  • 是一种特定类型的集合(具体类型的资源),旨在解决“生产者-消费者”任务;
  • 支持超时和取消机制(通过取消令牌),这使得更容易集成到使用 TPL 的代码中。

我认为,你的选择是BlockingCollection(如果你真的有很多读者和作家)。

于 2012-06-04T10:39:46.263 回答
2

如果您经常更改列表,那么ReaderWriterLockSlim可能对您没有帮助,因为它只允许单次写入访问,并且lock开销较小。就个人而言,我只会lock(在某些锁定对象上)在每次访问期间。

a 的问题BlockingCollection在于它只保证单个操作是原子的 - 但是,我们经常需要将多个操作作为一个单元执行(不仅仅是TryAdd等)。所以为了避免发疯,alock比较简单。

另一个优点是使用lock非常简单:

lock(syncLock) {
   // do stuff with the list
}

(它也有内置的信号通过Monitor.Waitand Monitor.Pulse*,这很好)

于 2012-06-04T10:36:58.293 回答