0

マルチスレッド アプリケーションで使用される List(of T) を含むクラスがあります。Get、Add、Remove の 3 つのメソッドがあり、List(of T) にアクセスして変更します。オブジェクトを追加または削除するときだけでなく、必要なオブジェクトを照会するときはいつでも、SyncLock を使用して m_List をロックしていました。 ただし、目的のオブジェクトを検索するときとは対照的に、オブジェクトを追加または削除するときに m_List をロックするだけでパフォーマンスが向上するかどうかについて興味がありますか?

Public Shared sub Add(SomeObject as object)

     SyncLock ctype(m_List, IList).SyncRoot

         m_List.add(SomeObject)

     end SyncLock

end sub

Public Shared sub Remove(SearchString as string)

     SyncLock ctype(m_List, IList).SyncRoot

           m_List.RemoveAll(function(o as SomeObject) o.SomeProperty = SearchString)

     end SyncLock
end Function

Public Shared Function Get(SearchString as string) as SomeObject
     'The Commented out code is what I am thinking of removing...
     'SyncLock ctype(m_List, IList).SyncRoot

     Dim FoundObjectList = m_List.where(function(o as SomeObject) o.SomeProperty = SearchString)

    if FoundObjectList.count > 0 then 

       If FoundObjectList(0).CreateDate < Now.AddMinutes(5) then
          Remove(FoundObjectList(0).SomeProperty)
          Return nothing
       end if
    else
         Return FoundObjectList(0)

    End if

   Return Nothing
'end SyncLock
end sub
4

1 に答える 1

6

リストを繰り返し処理し、その間に別のスレッドがエントリを追加できるようにすると、 が得られます。InvalidOperationExceptionそれはそれと同じくらい簡単です。私の推測では、それはあなたが望む動作ではありません。

List<T>あるスレッドからの書き込みと別のスレッドからの読み取りを同時にサポートしていません。特に、リストの反復処理はサポートしていません。

于 2010-11-16T17:52:20.463 に答える