Syntax für unterbrechbare Schloss in C #
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.
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.