【问题标题】:Which ADO.NET DataSet/DataTable Methods Are Safe For Multiple Reader Threads?哪些 ADO.NET 数据集/数据表方法对于多个读取器线程是安全的?
【发布时间】: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


【解决方案1】:

是的。 DataSet 和 DataTable 及相关项在读取时是线程安全的。正如您自己的报价所述。

因此,只要每个威胁克隆您的缓存项,然后修改克隆,您就无需担心。

是的,这一切都可以在 ReaderWriterLockSlim 的范围内安全地完成,它用于同步多个读取操作和一个写入操作。

【讨论】:

  • 感谢您的回复 Martin,这是我的假设。我要澄清的一点是 哪些 方法被认为是只读的,以及 DataSet::Clone 和 DataTable::ImportRow 是否在其中。表面上看起来是这样,但我不确定是否为克隆、复制等修改了内部状态。
  • 不客气。我理解你的疑问......但是如果 MSDN 说一些关于读或写操作和线程安全的类,它们意味着读操作由开发人员完成,而不是内部发生的事情,因为开发人员不知道内部发生了什么。也许在读操作之后状态被修改了,但是那个类本身有责任同步它。
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 2012-05-07
  • 2010-12-20
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
相关资源
最近更新 更多