Condividi tramite


ReaderWriterLockSlim.EnterUpgradeableReadLock Metodo

Definizione

Prova ad attivare il blocco in modalità aggiornabile.

public:
 void EnterUpgradeableReadLock();
public void EnterUpgradeableReadLock ();
member this.EnterUpgradeableReadLock : unit -> unit
Public Sub EnterUpgradeableReadLock ()

Eccezioni

La proprietà RecursionPolicy è NoRecursion e il thread corrente ha già acceduto al blocco in tutte le modalità.

-oppure-

Il thread corrente ha acceduto alla modalità di lettura, pertanto il tentativo di accedere alla modalità aggiornabile creerebbe la possibilità di un deadlock.

-oppure-

Il numero di ricorsioni supererebbe la capacità del contatore. Il limite è talmente elevato che le applicazioni non dovrebbero mai raggiungerlo.

L'oggetto ReaderWriterLockSlim è stato eliminato.

Esempio

Nell'esempio seguente viene illustrato come usare il metodo per immettere il EnterUpgradeableReadLock blocco in modalità aggiornabile. Un finally blocco viene usato per eseguire il ExitUpgradeableReadLock metodo, assicurandosi che il chiamante esca dalla modalità aggiornabile.

Il metodo illustrato nell'esempio recupera il valore associato a una chiave e lo confronta con un nuovo valore. Se il valore è invariato, il metodo restituisce uno stato che indica nessuna modifica. Se non viene trovato alcun valore per la chiave, viene inserita la coppia chiave/valore. Se il valore è stato modificato, viene aggiornato. La modalità aggiornabile consente al thread di aggiornare il blocco di lettura in base alle esigenze, senza rischi di deadlock.

L'esempio usa il costruttore senza parametri per creare il blocco, quindi la ricorsione non è consentita. ReaderWriterLockSlim La programmazione è più semplice e meno soggetta a errori quando il blocco non consente la ricorsione.

Questo codice fa parte di un esempio più grande fornito per la ReaderWriterLockSlim classe.

private ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();
private Dictionary<int, string> innerCache = new Dictionary<int, string>();
Private cacheLock As New ReaderWriterLockSlim()
Private innerCache As New Dictionary(Of Integer, String)
public AddOrUpdateStatus AddOrUpdate(int key, string value)
{
    cacheLock.EnterUpgradeableReadLock();
    try
    {
        string result = null;
        if (innerCache.TryGetValue(key, out result))
        {
            if (result == value)
            {
                return AddOrUpdateStatus.Unchanged;
            }
            else
            {
                cacheLock.EnterWriteLock();
                try
                {
                    innerCache[key] = value;
                }
                finally
                {
                    cacheLock.ExitWriteLock();
                }
                return AddOrUpdateStatus.Updated;
            }
        }
        else
        {
            cacheLock.EnterWriteLock();
            try
            {
                innerCache.Add(key, value);
            }
            finally
            {
                cacheLock.ExitWriteLock();
            }
            return AddOrUpdateStatus.Added;
        }
    }
    finally
    {
        cacheLock.ExitUpgradeableReadLock();
    }
}
Public Function AddOrUpdate(ByVal key As Integer, _
                            ByVal value As String) As AddOrUpdateStatus
    cacheLock.EnterUpgradeableReadLock()
    Try
        Dim result As String = Nothing
        If innerCache.TryGetValue(key, result) Then
            If result = value Then
                Return AddOrUpdateStatus.Unchanged
            Else
                cacheLock.EnterWriteLock()
                Try
                    innerCache.Item(key) = value
                Finally
                    cacheLock.ExitWriteLock()
                End Try
                Return AddOrUpdateStatus.Updated
            End If
        Else
            cacheLock.EnterWriteLock()
            Try
                innerCache.Add(key, value)
            Finally
                cacheLock.ExitWriteLock()
            End Try
            Return AddOrUpdateStatus.Added
        End If
    Finally
        cacheLock.ExitUpgradeableReadLock()
    End Try
End Function
public enum AddOrUpdateStatus
{
    Added,
    Updated,
    Unchanged
};
Public Enum AddOrUpdateStatus
    Added
    Updated
    Unchanged
End Enum

Commenti

Questo metodo blocca fino a quando il thread chiamante entra nel blocco e quindi potrebbe non restituire mai. Utilizzare il TryEnterUpgradeableReadLock metodo per bloccare per un intervallo specificato e quindi restituire se il thread chiamante non ha immesso la modalità aggiornabile durante tale intervallo.

Usare la modalità aggiornabile quando un thread accede in genere alla risorsa protetta dalla ReaderWriterLockSlim modalità di lettura, ma potrebbe essere necessario immettere la modalità di scrittura se vengono soddisfatte determinate condizioni. Un thread in modalità aggiornabile può eseguire il downgrade alla modalità di lettura o all'aggiornamento alla modalità di scrittura.

Solo un thread può immettere la modalità aggiornabile in qualsiasi momento. Se un thread è in modalità aggiornabile e non ci sono thread in attesa di immettere la modalità di scrittura, qualsiasi numero di altri thread può immettere la modalità di lettura, anche se ci sono thread in attesa di immettere la modalità aggiornabile.

Se uno o più thread sono in attesa di immettere la modalità di scrittura, un thread che chiama i blocchi del EnterUpgradeableReadLock metodo fino a quando tali thread non hanno timeout o immesso la modalità di scrittura e quindi sono usciti da esso.

Nota

Se un blocco consente la ricorsione, un thread che ha immesso il blocco in modalità aggiornabile può immettere in modo ricorsivo la modalità aggiornabile, anche se altri thread sono in attesa di immettere la modalità di scrittura.

Si applica a