Wie würden Sie einfach Monitor.TryEnter
-
05-07-2019 - |
Frage
Ich versuche, die Dinge einfacher zu machen. Hier ist mein Code:
If Threading.Monitor.TryEnter(syncRoot) Then
Try
'do something
Finally
Threading.Monitor.Exit(syncRoot)
End Try
Else
'do something else
End If
Das ist noch schlimmer als die ReaderWriterLock in Bezug auf Lärm. Ich kann C # oder VB verwenden, so Antworten auf entweder die Anwendung wird willkommen sein.
Lösung
Verwenden Sie einen Delegaten?
z.
public bool TryEnter(object lockObject, Action work)
{
if (Monitor.TryEnter(lockObject))
{
try
{
work();
}
finally
{
Monitor.Exit(lockObject);
}
return true;
}
return false;
}
Andere Tipps
Dies ist sehr ähnlich zu Ihrem letzten Beitrag , und ich würde eine ähnliche Antwort erwarten. Der einzige wesentliche Unterschied ist, dass Sie „null“ aus Ihrer Methode könnten zurückkehren, wenn das Timeout nicht - dann ist die „Entsorgung ()“ wird nicht aufgerufen, und Sie können den Wert leicht überprüfen:
using(var token = GetLock(syncLock, timeout)) {
if(token != null) { ... }
}
Die einzige wirkliche Panne ist, dass Sie nicht unbedingt wollen eine Erweiterungsmethode hinzufügen, um „Objekt“ (oder auch „T wobei T: class“) ...
Jon Skeet hat auf diesem in der Vergangenheit sieht - einen Blick wert .