Export (0) Print
Expand All

ReaderWriterLock.ReleaseLock Method

Releases the lock, regardless of the number of times the thread acquired the lock.

Namespace:  System.Threading
Assembly:  mscorlib (in mscorlib.dll)

'Declaration
Public Function ReleaseLock As LockCookie

Return Value

Type: System.Threading.LockCookie
A LockCookie value representing the released lock.

ReleaseLock releases the reader lock or writer lock, regardless of the recursive lock count. To restore the state of the lock, including the lock count, pass the LockCookie to RestoreLock.

The following code example shows how to use the ReleaseLock method to release the lock, regardless of how many times it has been acquired by the thread, and how to restore the state of the lock later.

This code is part of a larger example provided for the ReaderWriterLock class.

' The complete code is located in the ReaderWriterLock class topic. 
Imports System.Threading

Public Module Example
   Private rwl As New ReaderWriterLock()
   ' Define the shared resource protected by the ReaderWriterLock. 
   Private resource As Integer = 0


...


' Release all locks and later restores the lock state. 
' Uses sequence numbers to determine whether another thread has 
' obtained a writer lock since this thread last accessed the resource. 
Sub ReleaseRestore(timeOut As Integer)
   Dim lastWriter As Integer 

   Try
      rwl.AcquireReaderLock(timeOut)
      Try 
         ' It's safe for this thread to read from the shared resource, 
         ' so read and cache the resource value. 
         Dim resourceValue As Integer = resource
         Display("reads resource value " & resourceValue)
         Interlocked.Increment(reads)

         ' Save the current writer sequence number.
         lastWriter = rwl.WriterSeqNum

         ' Release the lock and save a cookie so the lock can be restored later. 
         Dim lc As LockCookie = rwl.ReleaseLock()

         ' Wait for a random interval and then restore the previous state of the lock.
         Thread.Sleep(rnd.Next(250))
         rwl.RestoreLock(lc)

         ' Check whether other threads obtained the writer lock in the interval. 
         ' If not, then the cached value of the resource is still valid. 
         If rwl.AnyWritersSince(lastWriter) Then
            resourceValue = resource
            Interlocked.Increment(reads)
            Display("resource has changed " & resourceValue)
         Else
            Display("resource has not changed " & resourceValue)
         End If 
      Finally 
         ' Ensure that the lock is released.
         rwl.ReleaseReaderLock()
      End Try 
   Catch ex As ApplicationException
      ' The reader lock request timed out.
      Interlocked.Increment(readerTimeouts)
   End Try 
End Sub


...


End Module

.NET Framework

Supported in: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1

.NET Framework Client Profile

Supported in: 4, 3.5 SP1
Show:
© 2015 Microsoft