ReaderWriterLockSlim.TryEnterWriteLock Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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.
O ReaderWriterLockSlim objeto foi descartado.
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.
O ReaderWriterLockSlim objeto foi descartado.
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.