2010-09-08 17 views
1

因爲asp.net包含多個線程同時執行。
所以如果2個線程訪問我從asp.net httpcontext緩存中獲得的對象(簡單或複雜)。
如果這兩個遊戲者試圖同時修改/讀取它,這不會導致該對象的狀態問題嗎?
那麼我應該實施什麼樣的預防措施?
例如,我想也許鎖定對象,同時使用它? (不會導致性能問題?)
或者當我從緩存中檢索一些對象時,我應該從中創建一個副本?
或者我可能根本不需要擔心這個問題?
謝謝什麼技術應該用來處理asp.net緩存中的對象,以防止多個asp.net工作線程訪問的問題?

回答

0

您需要根據問題的背景來確定此問題,所有解決方案均不適用於此。如果你只是在讀數據,那麼你將沒有線程問題。如果你正在頻繁地寫數據,那麼使用緩存就毫無意義。如果它的某種混合和緩存確實有助於提高性能等,那麼你需要使用正常的線程同步技術(例如讀寫器鎖),或者在對象的更改始終創建新對象的情況下使對象不可變。這個選擇會導致自己的線程問題,因爲新對象必須替換緩存中的舊對象。

0

在5年多的ASP.NET開發項目中,我從來沒有遇到過這種擔心的情況。

這就是說......你當然不會有問題閱讀任何項目。如果你有一個你想經常修改的對象,爲什麼它在緩存中開始?如果你不需要經常修改它,那麼鎖定對象不會是一個性能問題。

+0

假設這是一個域數據對象。該對象不會經常修改,但假設它在第二個線程正在讀取時被第一個線程修改,則第一個線程會將該對象保存到數據庫。 – Karim 2010-09-08 22:44:18

+0

鎖定所有代碼甚至只讀取對象的代碼。有一種方法可以鎖定寫入器,但並不像lock那樣簡單。這就是爲什麼鎖定會導致線程在讀取時被阻塞的原因。 – Karim 2010-09-08 22:45:57

+0

@Karim - @Bryan是對的。緩存中的對象應該是隻讀的。但是,如果你絕對必須修改這個對象 - 那麼用singleton模式來實現getters/setter呢? – RPM1984 2010-09-09 00:20:02