我有一个包含项目集合的对象。我希望能够通过 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();
}
}