ReaderWriterLockSlim.TryEnterWriteLock Método

Definição

Tenta inserir o bloqueio no modo de gravação, com um tempo limite opcional.

Sobrecargas

Nome Description
TryEnterWriteLock(Int32)

Tenta inserir o bloqueio no modo de gravação, com um tempo limite opcional.

TryEnterWriteLock(TimeSpan)

Tenta inserir o bloqueio no modo de gravação, com um tempo limite opcional.

TryEnterWriteLock(Int32)

Tenta inserir o bloqueio no modo de gravação, com um tempo limite 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 a aguardar ou -1 (Infinite) a aguardar indefinidamente.

Retornos

true se o thread de chamada entrou no modo de gravação, caso contrário, false.

Exceções

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

-ou-

O thread atual inicialmente inseriu o bloqueio no modo de leitura e, portanto, tentar entrar no modo de gravação criaria a possibilidade de um deadlock.

-ou-

O número de recursão excederia a capacidade do contador. O limite é tão grande que os aplicativos nunca devem encontrar ele.

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

Exemplos

O exemplo a seguir mostra como usar o TryEnterWriteLock método para inserir o bloqueio no modo de gravação, com um tempo limite. O método mostrado no exemplo adiciona um novo par chave/valor ao cache sincronizado. Se o intervalo de tempo limite especificado se esgotar antes que o thread insira o bloqueio, o método retornará false. O método retornará true se o par chave/valor for adicionado.

Se a chave já estiver no cache, a exceção gerada pela parte interna Dictionary<TKey,TValue> poderá encerrar o método. Um finally bloco é usado para executar o ExitWriteLock método, garantindo que o chamador saia do bloqueio.

Esse código faz parte de um exemplo maior fornecido para a 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 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

Comentários

Se millisecondsTimeout for 0 (zero), esse método verificará o estado de bloqueio e retornará false imediatamente se o estado desejado não estiver disponível.

Se outros threads tiverem inserido o bloqueio no modo de leitura, um thread que chama o TryEnterWriteLock método bloqueia até que esses threads tenham saído do modo de leitura ou até que o intervalo de tempo limite tenha decorrido. Enquanto os threads estão bloqueados aguardando para entrar no modo de gravação, threads adicionais que tentam entrar no modo de leitura ou no bloco de modo atualizável até que todos os threads que aguardam para entrar no modo de gravação tenham cronometrado ou inserido no modo de gravação e, em seguida, encerrados dele.

Note

Se um bloqueio permitir a recursão, um thread que inseriu o bloqueio no modo de gravação poderá entrar no modo de gravação recursivamente, mesmo que outros threads estejam aguardando para entrar no modo de gravação.

Aplica-se a

TryEnterWriteLock(TimeSpan)

Tenta inserir o bloqueio no modo de gravação, com um tempo limite 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 a ser esperado ou -1 milissegundos para aguardar indefinidamente.

Retornos

true se o thread de chamada entrou no modo de gravação, caso contrário, false.

Exceções

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

-ou-

O thread atual inicialmente inseriu o bloqueio no modo de leitura e, portanto, tentar entrar no modo de gravação criaria a possibilidade de um deadlock.

-ou-

O número de recursão excederia a capacidade do contador. O limite é tão grande que os aplicativos nunca devem encontrar ele.

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

-ou-

O valor é timeout maior que Int32.MaxValue milissegundos.

Comentários

Se timeout for 0 (zero), esse método verificará o estado de bloqueio e retornará false imediatamente se o estado desejado não estiver disponível.

Se outros threads tiverem inserido o bloqueio no modo de leitura, um thread que chama o TryEnterWriteLock método bloqueia até que esses threads tenham saído do modo de leitura ou até que o intervalo de tempo limite tenha decorrido. Enquanto os threads estão bloqueados aguardando para entrar no modo de gravação, threads adicionais que tentam entrar no modo de leitura ou no bloco de modo atualizável até que todos os threads que aguardam para entrar no modo de gravação tenham cronometrado ou inserido no modo de gravação e, em seguida, encerrados dele.

Note

Se um bloqueio permitir a recursão, um thread que inseriu o bloqueio no modo de gravação poderá entrar no modo de gravação recursivamente, mesmo que outros threads estejam aguardando para entrar no modo de gravação.

Aplica-se a