Прочитать на английском

Поделиться через


ReaderWriterLock.RestoreLock(LockCookie) Метод

Определение

Возвращает состояние блокировки потока к тому, которое было до вызова метода ReleaseLock().

[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public void RestoreLock(ref System.Threading.LockCookie lockCookie);
public void RestoreLock(ref System.Threading.LockCookie lockCookie);

Параметры

lockCookie
LockCookie

Объект LockCookie, возвращаемый ReleaseLock().

Атрибуты

Исключения

Адрес lockCookie является пустым указателем.

Примеры

В следующем примере кода показано, как использовать ReleaseLock метод для снятия блокировки, независимо от того, сколько раз она была получена потоком, и как восстановить состояние блокировки позже.

Этот код является частью более крупного примера, предоставленного ReaderWriterLock для класса .

// The complete code is located in the ReaderWriterLock class topic.
using System;
using System.Threading;

public class Example
{
   static ReaderWriterLock rwl = new ReaderWriterLock();
   // Define the shared resource protected by the ReaderWriterLock.
   static int resource = 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.
static void ReleaseRestore(Random rnd, int timeOut)
{
   int lastWriter;

   try {
      rwl.AcquireReaderLock(timeOut);
      try {
         // It's safe for this thread to read from the shared resource,
         // so read and cache the resource value.
         int resourceValue = resource;     // Cache the resource value.
         Display("reads resource value " + resourceValue);
         Interlocked.Increment(ref reads);

         // Save the current writer sequence number.
         lastWriter = rwl.WriterSeqNum;

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

         // Wait for a random interval and then restore the previous state of the lock.
         Thread.Sleep(rnd.Next(250));
         rwl.RestoreLock(ref 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)) {
            resourceValue = resource;
            Interlocked.Increment(ref reads);
            Display("resource has changed " + resourceValue);
         }
         else {
            Display("resource has not changed " + resourceValue);
         }
      }
      finally {
         // Ensure that the lock is released.
         rwl.ReleaseReaderLock();
      }
   }
   catch (ApplicationException) {
      // The reader lock request timed out.
      Interlocked.Increment(ref readerTimeouts);
   }
}
}

Комментарии

Состояние, восстановленное с помощью RestoreLock , включает рекурсивное число блокировок.

Поток блокируется, если он пытается восстановить блокировку чтения после того, как другой поток получил блокировку модуля записи, или если он пытается восстановить блокировку модуля записи после того, как другой поток получил блокировку чтения или записи. Так как RestoreLock не принимает тайм-аут, следует позаботиться о том, чтобы избежать возможных взаимоблокировок.

Внимание!

Перед вызовом RestoreLockубедитесь, что вы отпустили все блокировки, полученные с момента вызова ReleaseLock. Например, поток взаимоблокирует, если получает блокировку средства чтения, а затем пытается восстановить более раннюю блокировку модуля записи. Используйте IsReaderLockHeld и IsWriterLockHeld для обнаружения таких дополнительных блокировок.

Не используйте объект , возвращаемый LockCookie из UpgradeToWriterLock.

Применяется к

Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

См. также раздел