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.

War es hilfreich?

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top