ReaderWriterLock.DowngradeFromWriterLock(LockCookie) Metodo

Definizione

Ripristina lo stato del blocco del thread in vigore prima della chiamata al metodo UpgradeToWriterLock(Int32).

public void DowngradeFromWriterLock (ref System.Threading.LockCookie lockCookie);

Parametri

lockCookie
LockCookie

Oggetto LockCookie restituito dal metodo UpgradeToWriterLock(Int32).

Eccezioni

Il thread non è responsabile del blocco del writer.

L'indirizzo di lockCookie è un puntatore Null.

Esempio

Nell'esempio di codice seguente viene illustrato come richiedere un blocco lettore, aggiornare il blocco del lettore a un blocco writer e effettuare di nuovo il downgrade a un blocco lettore.

Questo codice fa parte di un esempio più ampio fornito per la ReaderWriterLock classe .

// 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;
// Requests a reader lock, upgrades the reader lock to the writer
// lock, and downgrades it to a reader lock again.
static void UpgradeDowngrade(Random rnd, int timeOut)
{
   try {
      rwl.AcquireReaderLock(timeOut);
      try {
         // It's safe for this thread to read from the shared resource.
         Display("reads resource value " + resource);
         Interlocked.Increment(ref reads);

         // To write to the resource, either release the reader lock and
         // request the writer lock, or upgrade the reader lock. Upgrading
         // the reader lock puts the thread in the write queue, behind any
         // other threads that might be waiting for the writer lock.
         try {
            LockCookie lc = rwl.UpgradeToWriterLock(timeOut);
            try {
               // It's safe for this thread to read or write from the shared resource.
               resource = rnd.Next(500);
               Display("writes resource value " + resource);
               Interlocked.Increment(ref writes);
            }
            finally {
               // Ensure that the lock is released.
               rwl.DowngradeFromWriterLock(ref lc);
            }
         }
         catch (ApplicationException) {
            // The upgrade request timed out.
            Interlocked.Increment(ref writerTimeouts);
         }

         // If the lock was downgraded, it's still safe to read from the resource.
         Display("reads resource value " + resource);
         Interlocked.Increment(ref reads);
      }
      finally {
         // Ensure that the lock is released.
         rwl.ReleaseReaderLock();
      }
   }
   catch (ApplicationException) {
      // The reader lock request timed out.
      Interlocked.Increment(ref readerTimeouts);
   }
}
}

Commenti

DowngradeFromWriterLock rilascia il blocco writer, indipendentemente dal numero di blocchi ricorsivi e ripristina il blocco del lettore mantenuto dal thread prima di eseguire l'aggiornamento al blocco del writer. Viene ripristinato il conteggio dei blocchi nel blocco lettore.

Nota

DowngradeFromWriterLock accetta un LockCookie oggetto ottenuto chiamando UpgradeToWriterLock. Non usare un LockCookie oggetto restituito da ReleaseLock.

Un thread non blocca durante il downgrade dal blocco del writer, anche se altri thread sono in attesa del blocco del writer, perché tutte le richieste di blocco del lettore vengono concesse quando viene rilasciato il blocco del writer.

Si applica a

Prodotto Versioni
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.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

Vedi anche