ReaderWriterLock.WriterSeqNum Proprietà

Definizione

Viene fornito il numero di sequenza corrente.

public int WriterSeqNum { get; }

Valore della proprietà

Numero di sequenza corrente.

Esempio

Nell'esempio di codice seguente viene illustrato come utilizzare la WriterSeqNum proprietà e il AnyWritersSince metodo per determinare se un altro thread ha acquisito il blocco writer sulla risorsa protetta dall'ultimo thread corrente che ha mantenuto il blocco del writer.

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;
// 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);
   }
}
}

Commenti

Il numero di sequenza aumenta ogni volta che un thread acquisisce il blocco del writer. È possibile salvare il numero di sequenza e passarlo a AnyWritersSince in un secondo momento, se si desidera determinare se altri thread hanno acquisito il blocco writer nel frattempo.

È possibile usare WriterSeqNum per migliorare le prestazioni dell'applicazione. Ad esempio, un thread potrebbe memorizzare nella cache le informazioni ottenute mantenendo un blocco lettore. Dopo il rilascio e la riacquisizione del blocco, il thread può determinare se altri thread sono stati scritti nella risorsa chiamando AnyWritersSince; in caso contrario, è possibile usare le informazioni memorizzate nella cache. Questa tecnica è utile quando si leggono le informazioni protette dal blocco è costoso; Ad esempio, l'esecuzione di una query di database.

Il chiamante deve contenere un blocco lettore o un blocco writer affinché il numero di sequenza sia utile.

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