ReaderWriterLockSlim.TryEnterWriteLock Método

Definição

Tenta entrar no bloqueio em modo de escrita, com um time-out opcional.

Sobrecargas

Name Description
TryEnterWriteLock(Int32)

Tenta entrar no bloqueio em modo de escrita, com um time-out opcional.

TryEnterWriteLock(TimeSpan)

Tenta entrar no bloqueio em modo de escrita, com um time-out opcional.

TryEnterWriteLock(Int32)

Tenta entrar no bloqueio em modo de escrita, com um time-out opcional.

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

Parâmetros

millisecondsTimeout
Int32

O número de milissegundos para esperar, ou -1 (Infinite) para esperar indefinidamente.

Devoluções

true se a thread que chamou entrou em modo de escrita, caso contrário, false.

Exceções

A RecursionPolicy propriedade é NoRecursion e o thread atual já entrou no bloqueio.

-ou-

O thread atual entrou inicialmente no bloqueio em modo de leitura e, portanto, tentar entrar no modo de escrita criaria a possibilidade de um deadlock.

-ou-

O número de recursão excederia a capacidade do contador. O limite é tão grande que as aplicações nunca o deverão encontrar.

O valor de millisecondsTimeout é negativo, mas não é igual a Infinite (-1), que é o único valor negativo permitido.

Exemplos

O exemplo seguinte mostra como usar o TryEnterWriteLock método para entrar no bloqueio em modo de escrita, com um time-out. O método mostrado no exemplo adiciona um novo par chave/valor à cache sincronizada. Se o intervalo de tempo especificado passar antes da thread entrar no bloqueio, o método devolve false. O método retorna true se o par chave/valor for somado.

Se a chave já estiver na cache, a exceção lançada pelo interior Dictionary<TKey,TValue> pode terminar o método. Um finally bloco é usado para executar o ExitWriteLock método, garantindo que o chamador sai do bloqueio.

Este código faz parte de um exemplo mais amplo fornecido para a ReaderWriterLockSlim turma.

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

Observações

Se millisecondsTimeout for 0 (zero), este método verifica o estado do bloqueio e retorna false imediatamente se o estado desejado não estiver disponível.

Se outros threads entrarem no lock em modo de leitura, um thread que chama o TryEnterWriteLock método bloqueia-se até que esses threads saiam do modo de leitura ou até que o intervalo de time-out tenha expirado. Enquanto as threads estão bloqueadas à espera de entrar no modo de escrita, as threads adicionais que tentam entrar no modo de leitura ou no modo atualizável bloqueiam até que todas as threads à espera de entrar no modo de escrita tenham expirado o tempo ou entrado no modo de escrita e depois saído dele.

Note

Se um bloqueio permitir recursão, um thread que entrou no lock em modo de escrita pode entrar no modo de escrita recursivamente, mesmo que outros threads estejam à espera de entrar no modo de escrita.

Aplica-se a

TryEnterWriteLock(TimeSpan)

Tenta entrar no bloqueio em modo de escrita, com um time-out opcional.

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

Parâmetros

timeout
TimeSpan

O intervalo para esperar, ou -1 milissegundos para esperar indefinidamente.

Devoluções

true se a thread que chamou entrou em modo de escrita, caso contrário, false.

Exceções

A RecursionPolicy propriedade é NoRecursion e o thread atual já entrou no bloqueio.

-ou-

O thread atual entrou inicialmente no bloqueio em modo de leitura e, portanto, tentar entrar no modo de escrita criaria a possibilidade de um deadlock.

-ou-

O número de recursão excederia a capacidade do contador. O limite é tão grande que as aplicações nunca o deverão encontrar.

O valor de timeout é negativo, mas não é igual a -1 milissegundos, que é o único valor negativo permitido.

-ou-

O valor de timeout é superior a Int32.MaxValue milissegundos.

Observações

Se timeout for 0 (zero), este método verifica o estado do bloqueio e retorna false imediatamente se o estado desejado não estiver disponível.

Se outros threads entrarem no lock em modo de leitura, um thread que chama o TryEnterWriteLock método bloqueia-se até que esses threads saiam do modo de leitura ou até que o intervalo de time-out tenha expirado. Enquanto as threads estão bloqueadas à espera de entrar no modo de escrita, as threads adicionais que tentam entrar no modo de leitura ou no modo atualizável bloqueiam até que todas as threads à espera de entrar no modo de escrita tenham expirado o tempo ou entrado no modo de escrita e depois saído dele.

Note

Se um bloqueio permitir recursão, um thread que entrou no lock em modo de escrita pode entrar no modo de escrita recursivamente, mesmo que outros threads estejam à espera de entrar no modo de escrita.

Aplica-se a