2

私が取り組んでいるプロジェクトは、商用分析ツールによって分析されました。Dispose()メソッドを呼び出さなかったため、ReaderWriterLockSlimの実装にメモリリークの潜在的な原因としてフラグが立てられました。

このロックでこのメソッドが呼び出されるのを見たことがありません。作業したコードまたは学習したコード例のいずれかです。Dispose()を呼び出す必要がありますか?スレッドがまだそれを必要としている間にそれが処分された場合はどうなりますか?これは可能ですか?

これが現在の使用方法のサンプルです-Dispose()はありません:

    Public Class Test 
    {

    private ReaderWriterLockSlim _lookupLock = new ReaderWriterLockSlim();

            public IDictionary<int, SomeObject> GetAll()
            {
                _lookupLock.EnterWriteLock();
                try
                {
                    if (X == null || X.Count == 0)
                    {
                        Do Something...;
                    }
                }
                finally
                {
                    _lookupLock.ExitWriteLock();
                }

                return Something...;
            }
}
4

2 に答える 2

4

廃棄する必要があります。

ほとんどの場合、aReaderWriterLockSlimは静的リソースを保護するために使用されるため、破棄する必要のない静的インスタンスになります。

ただし、あなたの場合(ReaderWriterLockSlimインスタンスごとに1つ)、クラスを作成し、を破棄する必要がありIDisposableますReaderWriterLockSlim

または、より良い代替手段は、インスタンスリソースを保護するために、ではなく通常のロック(つまり、モニター)を使用することReaderWriterLockSlimです。おそらくパフォーマンスの違いはそれほど大きくなく、コードが単純になり、クラスIDをisposableにする必要がなくなります。

のようなフレームワーククラスConcurrentDictionaryは通常のロックを使用します。

于 2012-09-13T18:03:31.207 に答える
0

クラスで、IDisposableから継承してみてください。このクラス宣言を例として見てください。

宣言をこれに変更し、もちろん、既存のコードの残りを追加します。

Public Class Test : IDisposable
{

}

以下の例で、どのように宣言しますか。

public class WriteLock : IDisposable
{
   ReaderWriterLockSlim _rwlock;
   public WriteLock(ReaderWriterLockSlim rwlock ) 
   { 
      _rwlock = rwlock;
      _rwlock.EnterWriteLock(); 
   }
   public void Dispose()
   {
      _rwlock.ExitWriteLock(); 
   }
}
于 2012-09-13T17:47:40.130 に答える