Sdílet prostřednictvím


ReaderWriterLockSlim.TryEnterWriteLock Metoda

Definice

Pokusí se zadat zámek v režimu zápisu s volitelným časovým limitem.

Přetížení

TryEnterWriteLock(Int32)

Pokusí se zadat zámek v režimu zápisu s volitelným časovým limitem.

TryEnterWriteLock(TimeSpan)

Pokusí se zadat zámek v režimu zápisu s volitelným časovým limitem.

TryEnterWriteLock(Int32)

Zdroj:
ReaderWriterLockSlim.cs
Zdroj:
ReaderWriterLockSlim.cs
Zdroj:
ReaderWriterLockSlim.cs

Pokusí se zadat zámek v režimu zápisu s volitelným časovým limitem.

public:
 bool TryEnterWriteLock(int millisecondsTimeout);
public bool TryEnterWriteLock (int millisecondsTimeout);
member this.TryEnterWriteLock : int -> bool
Public Function TryEnterWriteLock (millisecondsTimeout As Integer) As Boolean

Parametry

millisecondsTimeout
Int32

Počet milisekund, které se mají čekat, nebo -1 (Infinite) čekat na neomezenou dobu.

Návraty

truepokud volající vlákno přešlo do režimu zápisu, v opačném případě . false

Výjimky

Vlastnost RecursionPolicy je NoRecursion a aktuální vlákno již vstoupilo do zámku.

-nebo-

Aktuální vlákno původně vstoupilo do zámku v režimu čtení, a proto pokus o vstup do režimu zápisu by vytvořil možnost vzájemného zablokování.

-nebo-

Číslo rekurze by překročilo kapacitu čítače. Limit je tak velký, že by ho aplikace nikdy neměly narazit.

Hodnota millisecondsTimeout je záporná, ale nerovná se Infinite (-1), což je jediná povolená záporná hodnota.

Příklady

Následující příklad ukazuje, jak pomocí TryEnterWriteLock metody zadat zámek v režimu zápisu s vypršením časového limitu. Metoda uvedená v příkladu přidá do synchronizované mezipaměti nový pár klíč/hodnota. Pokud zadaný interval časového limitu uplyne před vstupem vlákna do zámku, vrátí falsemetoda . Metoda vrátí true , pokud je přidán pár klíč/hodnota.

Pokud je klíč již v mezipaměti, výjimka vyvolaná vnitřní Dictionary<TKey,TValue> je povoleno ukončit metodu. K finally provedení ExitWriteLock metody se používá blok, který zajišťuje, že volající opustí zámek.

Tento kód je součástí většího příkladu ReaderWriterLockSlim , který je k dispozici pro třídu.

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 bool AddWithTimeout(int key, string value, int timeout)
{
    if (cacheLock.TryEnterWriteLock(timeout))
    {
        try
        {
            innerCache.Add(key, value);
        }
        finally
        {
            cacheLock.ExitWriteLock();
        }
        return true;
    }
    else
    {
        return false;
    }
}
Public Function AddWithTimeout(ByVal key As Integer, ByVal value As String, _
                               ByVal timeout As Integer) As Boolean
    If cacheLock.TryEnterWriteLock(timeout) Then
        Try
            innerCache.Add(key, value)
        Finally
            cacheLock.ExitWriteLock()
        End Try
        Return True
    Else
        Return False
    End If
End Function

Poznámky

Pokud millisecondsTimeout je hodnota 0 (nula), tato metoda zkontroluje stav uzamčení a vrátí false okamžitě, pokud požadovaný stav není k dispozici.

Pokud jiná vlákna přešla do zámku v režimu čtení, vlákno, které volá metodu TryEnterWriteLock , blokuje, dokud tato vlákna ukončí režim čtení nebo dokud nevyplyne interval časového limitu. Zatímco vlákna jsou blokována a čekají na přechod do režimu zápisu, další vlákna, která se snaží přejít do režimu čtení nebo upgradovatelného režimu blokují, dokud všechna vlákna čekající na přechod do režimu zápisu buď nevypadnou, nebo nepřejdou do režimu zápisu a pak se z něj ukončí.

Poznámka

Pokud zámek umožňuje rekurze, vlákno, které zadalo zámek v režimu zápisu, může přejít do režimu zápisu rekurzivně, i když jiná vlákna čekají na vstup do režimu zápisu.

Platí pro

TryEnterWriteLock(TimeSpan)

Zdroj:
ReaderWriterLockSlim.cs
Zdroj:
ReaderWriterLockSlim.cs
Zdroj:
ReaderWriterLockSlim.cs

Pokusí se zadat zámek v režimu zápisu s volitelným časovým limitem.

public:
 bool TryEnterWriteLock(TimeSpan timeout);
public bool TryEnterWriteLock (TimeSpan timeout);
member this.TryEnterWriteLock : TimeSpan -> bool
Public Function TryEnterWriteLock (timeout As TimeSpan) As Boolean

Parametry

timeout
TimeSpan

Interval čekání nebo -1 milisekundy čekání na neomezenou dobu.

Návraty

truepokud volající vlákno přešlo do režimu zápisu, v opačném případě . false

Výjimky

Vlastnost RecursionPolicy je NoRecursion a aktuální vlákno již vstoupilo do zámku.

-nebo-

Aktuální vlákno původně vstoupilo do zámku v režimu čtení, a proto pokus o vstup do režimu zápisu by vytvořil možnost vzájemného zablokování.

-nebo-

Číslo rekurze by překročilo kapacitu čítače. Limit je tak velký, že by ho aplikace nikdy neměly narazit.

Hodnota timeout je záporná, ale nerovná se -1 milisekund, což je jediná záporná hodnota povolená.

-nebo-

Hodnota je timeout větší než Int32.MaxValue v milisekundách.

Poznámky

Pokud timeout je hodnota 0 (nula), tato metoda zkontroluje stav uzamčení a vrátí false okamžitě, pokud požadovaný stav není k dispozici.

Pokud jiná vlákna přešla do zámku v režimu čtení, vlákno, které volá metodu TryEnterWriteLock , blokuje, dokud tato vlákna ukončí režim čtení nebo dokud nevyplyne interval časového limitu. Zatímco vlákna jsou blokována a čekají na přechod do režimu zápisu, další vlákna, která se snaží přejít do režimu čtení nebo upgradovatelného režimu blokují, dokud všechna vlákna čekající na přechod do režimu zápisu buď nevypadnou, nebo nepřejdou do režimu zápisu a pak se z něj ukončí.

Poznámka

Pokud zámek umožňuje rekurze, vlákno, které zadalo zámek v režimu zápisu, může přejít do režimu zápisu rekurzivně, i když jiná vlákna čekají na vstup do režimu zápisu.

Platí pro