我正在为相对静态并定期从数据库更新的数据创建自定义缓存对象。我选择使用强类型数据集来存储缓存数据。现在,通过 ReaderWriterLockSlim 同步对自定义缓存对象的读取和刷新(客户端无法写入缓存,只能刷新)访问。但是,我想确保缓存的客户端不能通过同时修改其组成对象来破坏强类型数据集中的数据(DataTables、DataRows 等),即使客户端~ 不应该 ~更改数据。因此,我的方法是,在查找缓存项时,克隆强类型 DataSet 并用所需行及其相关父/子行的副本填充它,然后将其返回给客户端。基本上,将不可变缓存数据的副本返回给客户端,这样即使他们尝试修改它,其他线程也不会受到影响。
我的问题是,这可以在 ReaderWriterLockSlim 读锁中安全地完成吗?更直接地说,像 DataSet.Clone、DataTable.ImportRow 这样的方法对于读取器线程来说本质上是安全的,即它们是对克隆/复制对象的只读操作吗?考虑一下 MSDN 文档中有关 DataSet、DataTable 等的注释。
“这种类型对于多线程读取操作是安全的。您必须同步任何写入操作。”