Comment voudriez-vous simplement Monitor.TryEnter
-
05-07-2019 - |
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.
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 .