請考慮以下情況:我在ASP.NET中使用Application
對象來存儲由多個用戶同時訪問的集合(List(of MyObject)
)。而據我所知,從Application對象閱讀是線程安全的,我不知道我應該如何使此代碼線程安全的:我應該使用Application.Lock()嗎?
objList = Application("GlobalList")
objList.add(AnotherValue)
application("GlobalList") = objList
或
objList = Application("GlobalList")
dim PrunedList as MyObject() = (from o as MyObject in objList where o.SomeProperty = SomeValue).ToArray()
objList.Clear()
For each PrunedListObject as MyObject in PrunedList
objList.add(PrunedListObject)
next
application("GlobalList") = objList
我讀了一些關於Application.Lock( )這基本上是一個互斥鎖,但我擔心阻止其他線程的性能影響,同時操縱Application("GlobalList")
是Application.Lock()的正確方法?
雖然我一般同意Josh的回答,但在讀/寫方案中鎖被鎖定了很短的時間,'lock'語句仍然勝過'ReaderWriterLockSlim'(即使沒有寫入) 。當鎖內的時間足夠大時(根據http://tinyurl.com/rwlsperformance,調用大約100個不可插入的空方法),'ReaderWriterLockSlim'將會很有用。不僅可以讓用戶更快地「鎖定」你的代碼,更重要的是,它可以讓你更容易理解。 – Steven 2010-09-03 14:32:51
@Steven:我同意。我的個人測試表明,當關鍵部分能夠以快速和快捷的方式執行時,「ReadWriterLockSlim」比普通的舊'lock'慢大約5倍。添加和刪除「List」中的項目幾乎肯定會很快捷。否則,這通常是一個很好的答案。 – 2010-09-03 16:24:17
嗨,大家好,感謝您對ReaderWriterLockSlim的反饋。我知道舊的執行方式只是一條狗,但我認爲他們已經更接近於Monitor在新的實施方面的表現。無論如何,除非性能測試另有說明,否則我總是會採用最簡單的機制。 – Josh 2010-09-03 17:11:24