我有一个包含项目集合的对象。我希望能够通过 AddItem 方法将项目添加到集合中,并且还希望能够浏览集合中的所有项目。我的对象必须是线程安全的。我正在使用 ReaderWriterLockSlim 来确保正确同步。我应该如何同步 GoThroughAllItems 方法?我应该在整个持续时间(可能很长)中启动一个大的 ReadLock,还是应该为从集合中获取的每个项目释放锁,并为下一个重新获取锁?
这是一些示例代码:
私有 ReaderWriterLockSlim @lock = new ReaderWriterLockSlim(); 私有列表项 = 新列表(); 公共无效添加项(项目项) { this.@lock.EnterWriteLock(); 尝试 { //对项目做一些事情并将其添加到集合中 this.items.Add(item); } 最后 { this.@lock.ExitWriteLock(); } } 公共无效GoThroughAllItems() { this.@lock.EnterReadLock(); 尝试 { foreach(this.Items 中的项目项) { #如果选项2 this.@lock.ExitReadLock(); #万一 //处理item,可能需要很长时间 #如果选项2 this.@lock.EnterReadLock(); #万一 } } #如果选项2 抓住 #万一 #如果选项1 最后 #万一 { this.@lock.ExitReadLock(); } }