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.

Foi útil?

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top