2013-04-22 19 views
0

我正在爲相對靜態的數據創建自定義緩存對象,並且定期從數據庫更新數據。我選擇使用強類型的DataSet來存儲緩存的數據。現在,通過ReaderWriterLockSlim同步訪問讀取和刷新(客戶端無法寫入緩存,只刷新它)自定義緩存對象。然而,我想確保緩存的客戶端不能通過同時修改其組成對象來破壞強類型數據集中的數據(數據表,數據行等),即使客戶端不應該更改數據。因此,我的方法是在查找緩存項時,克隆強類型DataSet並填充所需行及其相關父/子行的副本並將其返回給客戶端。基本上,將不可變緩存數據的副本返回給客戶端,因此即使他們嘗試修改它,也不會影響其他線程。哪些ADO.NET DataSet/DataTable方法對多讀者線程安全?

我的問題是,這可以安全地在ReaderWriterLockSlim讀鎖內完成嗎?更直接地說,像DataSet.Clone,DataTable.ImportRow這樣的方法對讀者線程來說本質上是安全的,也就是說他們對克隆/複製的對象是隻讀操作嗎?考慮從MSDN文檔的DataSet,DataTable中本說明等

這種類型是安全的多線程讀操作,你必須同步任何寫操作。」

+0

來自文檔的引用確實回答了您的問題 - 它對於讀取操作是線程安全的。 – 2013-04-22 20:07:48

回答

1

是的。 DataSet和DataTable及相關項目在涉及閱讀時是線程安全的。正如你自己的報價所述。

所以只要每個威脅克隆你的緩存項目,然後修改克隆,你沒有什麼可擔心的。

是的,這可以安全地完成一個ReaderWriterLockSlim的範圍,這是爲了同步多個讀操作和一個寫操作而設計的。

+0

感謝您的回覆馬丁,那是我的假設。我正在尋求的澄清點是*哪些*方法被認爲是隻讀的,並且如果DataSet :: Clone和DataTable :: ImportRow是其中之一。表面上看起來如此,但我不確定內部狀態是否被修改爲克隆,複製等。 – 2013-04-22 22:18:44

+0

不客氣。我理解你的疑問......但是如果MSDN提到有關讀或寫操作和線程安全的類,他們的意思是讀取由開發人員完成的寫操作,而不是內部發生的事情,因爲開發人員無法知道內部發生了什麼。在讀取操作之後修改狀態會被修改,但是這是該類本身對其進行同步的可重複性。 – 2013-04-22 22:46:46