Como é que você simplesmente Monitor.TryEnter
-
05-07-2019 - |
Pergunta
Eu estou tentando fazer as coisas mais simples. Aqui está o meu código:
If Threading.Monitor.TryEnter(syncRoot) Then
Try
'do something
Finally
Threading.Monitor.Exit(syncRoot)
End Try
Else
'do something else
End If
Isto é ainda pior do que o ReaderWriterLock em termos de ruído. Eu posso usar C # ou VB, para que as respostas que se aplicam a ambos serão bem-vindos.
Solução
Use um delegado?
por exemplo.
public bool TryEnter(object lockObject, Action work)
{
if (Monitor.TryEnter(lockObject))
{
try
{
work();
}
finally
{
Monitor.Exit(lockObject);
}
return true;
}
return false;
}
Outras dicas
Isto é muito semelhante ao último post seu , e eu esperaria uma resposta similar. A única diferença significativa é que você pode voltar "nulo" de seu método se o tempo limite de falha - então o "Dispose ()" não é chamado, e você pode facilmente verificar o valor:
using(var token = GetLock(syncLock, timeout)) {
if(token != null) { ... }
}
A única real falha é que você não necessariamente quer adicionar um método de extensão para "objeto" (ou mesmo "T, onde T: class") ...
Jon Skeet analisou isso no passado - vale uma olhada .