1

asp.net アプリケーションで、静的メソッドまたは asp.net キャッシュを使用してコード実行のオーバーヘッドを削減したい 2 つのパターンを検討しています。それらは次のとおりです。

  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
    

    終了機能

その.NET 3.5用

パフォーマンスとスレッドセーフの点でどちらが優れているかアドバイスしてもらえますか?

ありがとう

4

1 に答える 1

0

最初のバージョンではDictionary、スレッドセーフではない を使用し、同期を使用してアクセスをスレッドセーフにしようとします。現状では、ロックが取得されていなくても辞書を更新するため、スレッドセーフではありません。

ConcurrentDictionaryを使用して、ロックコードを取り除く方がよいでしょう。

私が正しく理解している場合、2番目のバージョンはオブジェクトを使用しています。HttpApplicationStateこれは、通常System.Web.Caching.Cacheオブジェクトを使用する「キャッシング」とは異なります。どちらの場合でも、ディクショナリはスレッド セーフであり、ロック コードは冗長です。

もちろん、これは、辞書から取得したオブジェクトのメンバーにアクセスする際のスレッド セーフについては何も述べていません。不変の場合は問題ありません。そうでない場合は、追加の同期が必要になる場合があります。

于 2013-06-26T09:58:39.767 に答える