ASP.NET应用程序中的静态与缓存

时间:2013-06-26 09:38:49

标签: asp.net multithreading caching singleton

我正在考虑我的asp.net应用程序中的两种模式,我希望通过静态方法或使用asp.net缓存来减少代码执行的开销。它们如下。

  1. 静态方法

    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)
    

    结束职能

  2. 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
    

    结束职能

  3. 适用于.NET 3.5

    有人可以建议哪些在性能和线程安全性方面更好?

    由于

1 个答案:

答案 0 :(得分:0)

您的第一个版本使用Dictionary,它不是线程安全的,并尝试使用同步来使访问线程安全。就目前而言,即使未获取锁定,也会更新字典,因此它不是线程安全的。

您最好使用ConcurrentDictionary并删除锁定代码。

如果我理解正确,你的第二个版本是使用HttpApplicationState对象,这与“缓存”不同 - 通常使用System.Web.Caching.Cache对象。在任何一种情况下,字典都是线程安全的,你的锁定代码是多余的。

当然,这些都没有说明访问从字典中检索的对象成员的线程安全性。如果它是不可变的,你会没事的,否则你可能需要额外的同步。