我正在考虑我的asp.net应用程序中的两种模式,我希望通过静态方法或使用asp.net缓存来减少代码执行的开销。它们如下。
静态方法
Private Shared _transforms As New System.Collections.Generic.Dictionary(Of System.Type, MyObject)()
Private Shared Function Load(theType As System.Type) As MyObject
Dim lockAquired As Boolean
If Not _transforms.ContainsKey(theType) Then
Try
lockAquired = Monitor.TryEnter(_synchInstanceLock, LOCK_TIME_OUT)
'...DO MY MEMORY INTENSIVE TASK HERE
_transforms.Add(theType, doc)
Catch ex As Exception
Throw (ex)
Finally
If lockAquired = True Then
Monitor.Exit(_synchInstanceLock)
End If
End Try
End If
Return _transforms(theType)
结束职能
ASP.NET缓存,注意:缓存只是ASP.NET应用程序[“”]缓存
的包装器Private Function Load(theTypeAs System.Type) As MyObject
Dim doc As MyObject = Nothing
Dim lockAquired As Boolean
Try
lockAquired = Monitor.TryEnter(_synchInstanceLock, LOCK_TIME_OUT)
Dim key As String = GenerateCacheKey(GetType(MyObject), theType.Name)
Dim cacheData As MyObject = TryCast(Cache(key), MyObject)
If cacheData Is Nothing Then
'...DO MY MEMORY INTENSIVE TASK HERE
Cache.Insert(key, doc)
Else
doc = TryCast(cacheData, MyObject)
End If
Catch ex As Exception
Throw (ex)
Finally
If lockAquired = True Then
Monitor.Exit(_synchInstanceLock)
End If
End Try
Return doc
结束职能
适用于.NET 3.5
有人可以建议哪些在性能和线程安全性方面更好?
由于
答案 0 :(得分:0)
您的第一个版本使用Dictionary
,它不是线程安全的,并尝试使用同步来使访问线程安全。就目前而言,即使未获取锁定,也会更新字典,因此它不是线程安全的。
您最好使用ConcurrentDictionary
并删除锁定代码。
如果我理解正确,你的第二个版本是使用HttpApplicationState
对象,这与“缓存”不同 - 通常使用System.Web.Caching.Cache
对象。在任何一种情况下,字典都是线程安全的,你的锁定代码是多余的。
当然,这些都没有说明访问从字典中检索的对象成员的线程安全性。如果它是不可变的,你会没事的,否则你可能需要额外的同步。