2011-10-12 43 views
7

ReadWriterLockSlimが "System.Threading.SynchronizationLockException - 書き込みロックが保持されずに解放されています"という例外をスローしている状況があります。私はExitWriteLock()を実行しようとすると。私が知る限り、tryブロックに入る後続のスレッドはロックを取得できるようになるまで「ブロック」されるので、これは起こりません。私はここに何かを逃していますか書き込みロックが保持されずに解放されています

問題はthis oneと非常によく似ていますが、解決策はありませんでした。

//Code simplified for example. 

public class i18nService { 
    internal static ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion); 

    private string ProcessText() 
    { 
     try { 
      cacheLock.EnterWriteLock(); 
      return "xyz"; 
     } 
     finally { 
      cacheLock.ExitWriteLock(); // Error is throwing here. 
     } 
    } 
} 

答えて

4
try { 
     cacheLock.EnterWriteLock(); 
     return "xyz"; 
    } 
    finally { 
     cacheLock.ExitWriteLock(); // Error is throwing here. 
    } 

Q :-)あなたの助けに深く感謝を申し上げ:cacheLock.EnterWriteLock();が失敗した場合はどうなりますか?

A:finally文が実行されます。

  • cacheLock.ExitWriteLock();
  • と呼ばれるしかし、私たちがロックを持っていない

はこれを試してみてくださいます:

private string ProcessText() 
{ 
    cacheLock.EnterWriteLock(); 
    try { 
     return "xyz"; 
    } 
    finally { 
     cacheLock.ExitWriteLock(); // Error is throwing here. 
    } 
} 

おそらく.NETがあればEnterWriteLock()が失敗するように設計され、ロックは解除されます(まったく保持されません)。

+0

G'dayブレンダン。応答していただきありがとうございます。私は実際に同様の行に沿って考えましたが、それが正しいかどうかはわかりません。 from http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.enterwritelock.aspx "このメソッドは、呼び出し元のスレッドがロックに入るまでブロックされないため、返されることはありません。TryEnterWriteLockメソッドを使用します指定された間隔でブロックし、呼び出し中のスレッドがその間隔の間に書込みモードに入っていない場合は戻る。 しかし、あなたが指摘しているように、私はEnterWriteLock()の例外を許可していません... ...うーん...もう少しそれを試してみましょう。 –

6

しかし、ロックを入力しようとするとエラーがスローされた場合、それを保持せずに最後に実行されます。単純にケンジにしないでください:

... 
finally { 
    if(cacheLock.IsWriteLockHeld) 
     cacheLock.ExitWriteLock(); 
} 
... 
+0

こんにちは。私はあなた(そしてブレンダン)が正しいと思います。乾杯:-) –

関連する問題