锁定写一个属性

时间:2014-07-30 08:42:52

标签: c# .net multithreading thread-safety locking

在我班上我有这个属性:

public List<MyObject> mCollection { get; set; }

此集合用于某些不同的主题。

我想要做的只是在所有线程都已完成阅读mCollection时才允许编写此属性。

类似于获取和释放令牌,以及仅在释放所有令牌时才允许写入。在框架中有类似的东西吗?

提前致谢

2 个答案:

答案 0 :(得分:1)

有很多方法可以实现这一目标。为了简单起见,让读者通过彼此同步合作。

  • 让读者使用ReaderWriterLockSlim进行读锁定。让作者写一个写锁。
  • 让读者发出CountdownEvent信号。让作家等待它。
  • 让所有读者和作家SignalAndWait成为Barrier,这样作家只有在每个人都完成后才能继续。

选择符合您情景的内容。

答案 1 :(得分:0)

虽然有一些结构可以帮助SemaphoreSlim,但我坚信有更好的解决问题的方法。这可能就像使用ImmutableList而不是List并更改您的调用代码来使用它一样。

在您的方案中使用锁定机制必须由调用者和有权访问您的属性的人员实现。由于这是公开的,你没有办法强制调用者提交一个锁定机制,而不是检索列表,包含在一个IDisposable中,它将释放对dispose的锁定(这有点复杂,因为你有获取IEnumerator之前锁定)。但是,我相信,重构源代码以使用经过验证的结构是一种更好的解决方案。

如果您需要链接事件或处理器,我强烈建议您使用TPL Dataflow。这将使您摆脱一个线程等待某些东西变得可用时遇到的问题,并且还将产生明显更好的设计和更易于维护的代码。