2011-10-12 10 views
7

Mam sytuację, w której ReadWriterLockSlim rzuca wyjątek "System.Threading.SynchronizationLockException - Blokada zapisu jest zwalniana bez trzymania." kiedy próbuję wykonać ExitWriteLock(). O ile wiem, nie powinno to mieć miejsca, ponieważ kolejne wątki, które wchodzą do bloku try, będą "blokować", dopóki nie uzyskają blokady. Czy coś mi umyka?Puszczenie blokady zostanie zwolnione bez trzymania

Problem wygląda bardzo podobnie do this one, ale nie podano tam rozwiązania.

//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. 
     } 
    } 
} 

Dziękuję bardzo za pomoc :-)

Odpowiedz

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

Q: Co się stanie, jeśli cacheLock.EnterWriteLock(); nie powiedzie?

A: Instrukcja finally zostaje wykonana.

  • cacheLock.ExitWriteLock(); pobiera nazywane
  • Ale nie mamy blokadę

Spróbuj tego:

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

Przypuszczalnie NET jest zaprojektowany w taki sposób, że jeśli EnterWriteLock() zawodzi, zamek zostaje zwolniony (lub nigdy nie jest trzymany).

+0

G'day Brendan. Dzięki za odpowiedzi. Myślałem o podobnej linii, ale nie jestem pewien, czy tak jest. z http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.enterwritelock.aspx "Ta metoda blokuje, dopóki wątek wywołujący nie wejdzie do blokady, a zatem może nigdy nie powrócić. Użyj metody TryEnterWriteLock blokować przez określony czas, a następnie zwracać, jeśli wątek wywołujący nie wprowadził trybu zapisu w tym przedziale. " Jednakże, jak zauważyłeś, nie dopuszczam wyjątku na EnterWriteLock() ... hmmm ... pozwól mi się z nim jeszcze trochę pobawić. –

6

Ale jeśli zostanie zgłoszony błąd podczas próby wprowadzenia blokady, zostanie ona wykonana w końcu, bez jej zatrzymywania. Dlaczego po prostu nie chciałyby się chenge:

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

Cześć Petar. Myślę, że ty (i Brendan) masz rację. Twoje zdrowie :-) –

Powiązane problemy