我有System.Collections.Generic.List _myList
并且许多线程可以从中读取或同时向其添加项目。根据我的阅读,我应该使用'BlockingCollection',这样就行了。我还阅读了关于ReaderWriterLockSlim
和lock
的内容,但我不知道如何使用它们代替BlockingCollection
,所以我的问题是我可以这样做:
而不是使用'BlockingCollection'。如果是,您能否提供简单示例以及使用BlockingCollection
,ReaderWriterLockSlim
,lock
的优缺点?
已更新 读者不仅仅是作家!
答案 0 :(得分:5)
ReaderWriterLockSlim
:
lock
:
Monitor
class; BlockingCollection
:
我认为,你的选择是BlockingCollection
(如果你真的有很多读者和作家)。
答案 1 :(得分:2)
如果您经常突变列表,那么ReaderWriterLockSlim
可能无法帮助您,因为它只允许单次写访问,lock
开销较小。就个人而言,在每次访问期间,我只会lock
(在一些锁定对象上)。
BlockingCollection
的问题在于它只保证单个操作是原子的 - 但是,我们经常需要将多个操作作为一个单元执行(不仅仅是{{1等等)。所以为了避免疯狂,TryAdd
更简单。
另一个优点是lock
的使用非常简单:
lock
(它还通过lock(syncLock) {
// do stuff with the list
}
和Monitor.Wait
建立内置信号,这很不错)