C# 强制对特定对象和任何扩展进行原子化修改

C# 强制对特定对象和任何扩展进行原子化修改,c#,concurrency,locking,C#,Concurrency,Locking,我有点读写困难 我有一个特定对象的静态集合,可以被许多读者和作者同时访问 编写器将从集合处理程序获取一个项,然后以某种方式对其进行修改 读者可以从集合处理程序中获取特定项,然后以某种方式显示它 现在我意识到这个问题的标准解决方案是创建一个锁(或ReaderWriter锁),并强制每个写入程序和读取器进入锁。问题是,我不是唯一一个添加读写器的人,因此有可能有人会忘记在实现中使用锁,从而破坏一切 那么,从一个物体的角度来看,有没有一种方法可以迫使所有的改变以原子的方式进行呢?请记住,此对象将以多种形

我有点读写困难

我有一个特定对象的静态集合,可以被许多读者和作者同时访问

编写器将从集合处理程序获取一个项,然后以某种方式对其进行修改

读者可以从集合处理程序中获取特定项,然后以某种方式显示它

现在我意识到这个问题的标准解决方案是创建一个锁(或ReaderWriter锁),并强制每个写入程序和读取器进入锁。问题是,我不是唯一一个添加读写器的人,因此有可能有人会忘记在实现中使用锁,从而破坏一切


那么,从一个物体的角度来看,有没有一种方法可以迫使所有的改变以原子的方式进行呢?请记住,此对象将以多种形式扩展,并且它们也必须以这种方式进行限制。

如果无法信任对象的消费者遵守安全规则,则您会遇到一个大问题。我可以看到两种解决方案:

1) 什么也不做。如果您的消费者编写了错误的代码,那么他们发现自己陷入的痛苦将是一个很好的激励,促使他们不再这样做

1a)你可以让他们更痛苦,比如说,让你的对象在没有读锁的情况下以某种方式检测到它正在被读取,然后抛出异常。这就是我们在为JScript和VBScript引擎设计线程规则时所做的;如果用户曾经调用不支持该方法的线程上的方法,那么引擎将返回“catestrophic failure”错误代码。发动机的用户不会犯两次这样的错误;他们很快就知道哪个线程是正确的,哪个线程是错误的,并且停止调用错误的线程

这是一个比简单地允许呼叫在大多数时间成功,然后在百万分之一的时间内死于某个疯狂的比赛条件问题要好得多的解决方案


2) 将获得锁的责任转移到对象中。让消费者正常使用物品;无论何时读取或写入对象,对象都会取出自己的读写器锁。

2)如何修改集合中的对象(问题中提到过)?类似于
ModifyAt(int-index,Action-modification)
?1a)的方法抛出异常将是一个很好的解决方案,但我不知道如何让对象检测到这一点。关于2)我假设您希望我将锁放在属性的所有getter/setter中。虽然这样做很有效(听起来很耗时)-一旦有人扩展对象(这个对象在各个分支中会被扩展很多次),我就会失去保护。@Haedrian:解决这个问题的一个方法是:获取锁的函数是公共的,但不是虚拟的。扩展点是一个受虚拟保护的函数,由公共函数调用。您能使项不可变吗?与字符串非常相似吗?不知何故检测到有变化,销毁旧对象并链接到新对象?这对我的愿望来说太慢了不幸的是,将会有大量的阅读/写作。