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