锁定写入属性
本文关键字:属性 锁定 | 更新日期: 2023-09-27 18:15:39
在我的类中,我有这个属性:
public List<MyObject> mCollection { get; set; }
这个集合在不同的线程中使用。
我想做的是允许只在所有线程完成读取mCollection
时才写入此属性。
类似于获取和释放一个令牌,并且只有当所有令牌都被释放时才允许写入。在框架中有类似的东西吗?
Thanks in advance
有很多方法可以做到这一点。为了保持简单,让你的读者通过相互同步来合作。
- 用
ReaderWriterLockSlim
让读锁取读锁。 - 让读取器发出
CountdownEvent
信号。让写入器等待。 - 让所有的读和写程序都是
SignalAndWait
aBarrier
,这样写程序只有在每个人都完成后才能继续。
虽然有一些结构可以提供帮助,如SemaphoreSlim,但我坚信有更好的方法来解决您的问题。这可能就像使用immutableelist而不是List,并更改调用代码来使用它。
在您的场景中使用锁定机制,必须由调用者和有权访问您的属性的人实现。由于这是公共的,所以您没有任何方法强制调用者提交到锁定机制,除了检索包含在IDisposable中的列表,该列表将在dispose时释放锁(这比这更复杂,因为您必须在获得IEnumerator之前进行锁定)。然而,我再次相信重构源代码以使用经过验证的构造是一个更好的解决方案。
如果你需要链事件或处理器,我强烈建议你使用TPL数据流。这将使您从一个线程等待某些东西可用时所面临的问题中解脱出来,并且还将导致更好的设计和更易于维护的代码。