ReaderWriterLock.UpgradeToWriterLock Metodo

Definizione

Consente l'aggiornamento da un blocco del lettore al blocco del writer.

Overload

UpgradeToWriterLock(Int32)

Aggiorna un blocco del lettore al blocco del writer, usando un valore Int32 per il timeout.

UpgradeToWriterLock(TimeSpan)

Aggiorna un blocco del lettore al blocco del writer, usando un valore TimeSpan per il timeout.

UpgradeToWriterLock(Int32)

Origine:
ReaderWriterLock.cs
Origine:
ReaderWriterLock.cs
Origine:
ReaderWriterLock.cs

Aggiorna un blocco del lettore al blocco del writer, usando un valore Int32 per il timeout.

public System.Threading.LockCookie UpgradeToWriterLock (int millisecondsTimeout);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public System.Threading.LockCookie UpgradeToWriterLock (int millisecondsTimeout);

Parametri

millisecondsTimeout
Int32

Timeout in millisecondi.

Restituisce

Valore LockCookie.

Attributi

Eccezioni

L'intervallo millisecondsTimeout scade prima che la richiesta di blocco sia stata soddisfatta.

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

Quando un thread chiama UpgradeToWriterLock il blocco del lettore viene rilasciato, indipendentemente dal numero di blocchi e il thread passa alla fine della coda per il blocco del writer. Di conseguenza, altri thread potrebbero scrivere nella risorsa prima che al thread che ha richiesto l'aggiornamento venga concesso il blocco del writer.

Importante

L'eccezione di timeout non viene generata fino a quando il thread che ha chiamato il UpgradeToWriterLock metodo può riacquisire il blocco lettore. Se non sono presenti altri thread in attesa del blocco del writer, questo avviene immediatamente. Tuttavia, se un altro thread viene accodato per il blocco writer, il thread che ha chiamato il UpgradeToWriterLock metodo non può riacquisire il blocco del lettore finché tutti i lettori correnti non hanno rilasciato i blocchi e un thread ha acquisito e rilasciato il blocco del writer. Questo vale anche se l'altro thread che ha richiesto il blocco del writer lo ha richiesto dopo il thread corrente chiamato il UpgradeToWriterLock metodo .

Per ripristinare lo stato di blocco, chiamare DowngradeFromWriterLock utilizzando l'oggetto LockCookie restituito da UpgradeToWriterLock. Non usarlo LockCookie con RestoreLock.

Quando un thread non ha alcun blocco lettore, non usare UpgradeToWriterLock. In alternativa, utilizzare AcquireWriterLock.

Per i valori di timeout validi, vedere ReaderWriterLock.

Vedi anche

Si applica a

.NET 9 e altre versioni
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

UpgradeToWriterLock(TimeSpan)

Origine:
ReaderWriterLock.cs
Origine:
ReaderWriterLock.cs
Origine:
ReaderWriterLock.cs

Aggiorna un blocco del lettore al blocco del writer, usando un valore TimeSpan per il timeout.

public System.Threading.LockCookie UpgradeToWriterLock (TimeSpan timeout);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public System.Threading.LockCookie UpgradeToWriterLock (TimeSpan timeout);

Parametri

timeout
TimeSpan

Parametro TimeSpan che specifica il periodo di timeout.

Restituisce

Valore LockCookie.

Attributi

Eccezioni

L'intervallo timeout scade prima che la richiesta di blocco sia stata soddisfatta.

Il parametro timeout specifica un valore negativo diverso da -1 millisecondi.

Commenti

Quando un thread chiama UpgradeToWriterLock il blocco del lettore viene rilasciato, indipendentemente dal numero di blocchi e il thread passa alla fine della coda per il blocco del writer. Di conseguenza, altri thread potrebbero scrivere nella risorsa prima che al thread che ha richiesto l'aggiornamento venga concesso il blocco del writer.

Importante

L'eccezione di timeout non viene generata fino a quando il thread che ha chiamato il UpgradeToWriterLock metodo può riacquisire il blocco lettore. Se non sono presenti altri thread in attesa del blocco del writer, questo avviene immediatamente. Tuttavia, se un altro thread viene accodato per il blocco writer, il thread che ha chiamato il UpgradeToWriterLock metodo non può riacquisire il blocco del lettore finché tutti i lettori correnti non hanno rilasciato i blocchi e un thread ha acquisito e rilasciato il blocco del writer. Questo vale anche se l'altro thread che ha richiesto il blocco del writer lo ha richiesto dopo il thread corrente chiamato il UpgradeToWriterLock metodo .

Per ripristinare lo stato di blocco, chiamare DowngradeFromWriterLock utilizzando l'oggetto LockCookie restituito da UpgradeToWriterLock. Non usarlo LockCookie con RestoreLock.

Quando un thread non ha alcun blocco lettore, non usare UpgradeToWriterLock. In alternativa, utilizzare AcquireWriterLock.

Per i valori di timeout validi, vedere ReaderWriterLock.

Vedi anche

Si applica a

.NET 9 e altre versioni
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