Frage

Ich vermute, dass dies eine sehr dumme Frage ist: Was ist die korrekte Syntax für eine unterbrechbare lock-Anweisung in C #? Z.B. erhalten Sperre; wenn Sperre vor gesperrt Code beendet wird unterbrochen, return false aus dem einschließenden Verfahren. Wahrscheinlich völlig die falsche Terminologie ... Danke.

War es hilfreich?

Lösung

Sie können einen Timeout haben, während aquiring ein Schloss mit Monitor.TryEnter; und ebenfalls innerhalb einer Sperre Sie können Dinge wie Monitor.Wait / Monitor.Pulse, um vorübergehend die Sperre zu ergeben, aber man kann auch nicht als solche unterbrochen werden.

Der Haupt Weckalarm gilt in Thread.Sleep auch sein mag, die mit Thread.Interrupt unterbrochen werden kann - aber auch hier diese Kontrolle nicht aus einem ausgeführten Verfahrensblock zerren wird

.

Was genau ist es, dass Sie versuchen zu erreichen? Mit mehr Kontext können wir wahrscheinlich mehr helfen ...

Andere Tipps

Was Sie unter "unterbrochen" ist unklar.

Unterbrechung durch Exception

private bool SomeLockingMethod(object foo)
{
    // Verify foo is valid

    try
    {
       lock(foo)
       {
          while(something)
          {
             // Do stuff

             Thread.Sleep(1); // Possibly yield to another 
                              // thread calling Thread.Interrupt
          }
       }

       return true;
    }
    catch(ThreadInterruptedException ex)
    {
       // Handle exception
    }

    return false;
}

Wenn der return true nicht erreicht wird, dann geschah etwas, während die Sperre auf foo gehalten wurde, und der Code gibt false. Das Schloss wird automatisch freigegeben, so oder so.

Ein anderer Thread kann diese eine Unterbrechung durch den Aufruf Thread.Interrupt .

"Unterbrechung" von Code

Wenn Sie die eine „Unterbrechung“ den Code sind, dann könnte es so einfach sein wie

private bool SomeLockingMethod(object foo)
{
    // Verify foo is valid

    lock(foo)
    {
       // Do stuff

       if(shouldInterrupt)
       {
          return false;
       }

       // Do more stuff
    }

    return true;
 }

Auch hier wird die Sperre automatisch freigegeben wird, ob es eine „Unterbrechung“.

Unterbrechung, weil jemand anderes versucht, die Sperre

zu erwerben

Vielleicht ist es das, was Sie suchen; in diesem Fall sollten Sie etwas anderes verwenden, wie ein Semaphore oder ManualResetEvent .

Ich bin nicht sicher, was Sie versuchen zu hier zu bekommen. Der Zweck der lock Aussage ist, dass Sie nicht bekommen unterbrochen sollte, so dass Sie ein konsistentes Verhalten sicherstellen kann.

Was sind Sie versuchen, hier zu tun?

Sie auch einen Blick auf Transaktionsbereich haben könnten, hinzugefügt in 2.0, die (wegen der Mehrdeutigkeit in Ihrer Frage unbekannt,) können sein, was Sie suchen. Es ermöglicht Ihnen, einige Aktionen, um zu versuchen, dann rollen zurück, wenn diese Maßnahmen nicht ordnungsgemäß abgeschlossen wurden.

Sehen Sie hier für weitere Details.

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