Question

J'essaie de simplifier les choses. Voici mon code:

    If Threading.Monitor.TryEnter(syncRoot) Then
        Try
            'do something
        Finally
            Threading.Monitor.Exit(syncRoot)
        End Try
    Else
        'do something else
    End If

C’est encore pire que le ReaderWriterLock en termes de bruit. Je peux utiliser C # ou VB, les réponses à ces questions seront donc les bienvenues.

Était-ce utile?

La solution

Utiliser un délégué?

ex.

public bool TryEnter(object lockObject, Action work) 
{
    if (Monitor.TryEnter(lockObject)) 
    {
       try 
       {
          work();
       }
       finally 
       {
           Monitor.Exit(lockObject);
       }        
       return true;
     }

     return false;
}

Autres conseils

Ceci est très similaire à votre dernier message et j'attendrais une réponse similaire. La seule différence significative est que vous pouvez renvoyer & null; null " à partir de votre méthode si le délai d’expiration échoue - le programme & Dispose () " n'est pas appelé, et vous pouvez facilement vérifier la valeur:

using(var token = GetLock(syncLock, timeout)) {
  if(token != null) { ... }
}

Le seul petit problème est que vous ne voulez pas forcément ajouter une méthode d'extension à & object; object " (ou même "T où T: classe") ...

Jon Skeet a déjà examiné cette question dans le passé - vaut le détour .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top