请考虑以下情况:我在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