【发布时间】:2013-04-15 19:57:06
【问题描述】:
我正在为相对静态且定期从数据库更新的数据创建自定义缓存对象。我选择使用强类型数据集来存储缓存数据。现在,通过 ReaderWriterLockSlim 同步对自定义缓存对象的读取和刷新(客户端无法写入缓存,只能刷新)访问。但是,我想确保缓存的客户端不会通过同时修改其组成对象来破坏强类型数据集中的数据(DataTables、DataRows 等),即使客户端 ~不应该~ em> 更改数据。因此,我的方法是,在查找缓存项时,克隆强类型 DataSet 并用所需行及其相关父/子行的副本填充它,然后将其返回给客户端。基本上,将不可变缓存数据的副本返回给客户端,这样即使他们尝试修改它,也不会影响其他线程。
我的问题是,这可以在 ReaderWriterLockSlim 读锁中安全地完成吗?更直接地说,诸如 DataSet.Clone、DataTable.ImportRow 之类的方法对于读取器线程而言是否本质上是安全的,即它们是对克隆/复制对象的只读操作吗?考虑一下 MSDN 文档中有关 DataSet、DataTable 等的注释。
“这种类型对于多线程读取操作是安全的。您必须同步所有写入操作。”
【问题讨论】:
-
文档中的引用确实回答了您的问题 - 它对于读取操作是线程安全的。
标签: c# multithreading caching ado.net thread-safety