我怀疑这是一个非常愚蠢的问题:C# 中可中断锁语句的正确语法是什么?例如获取锁;如果锁定在锁定代码完成之前被中断,则从封闭方法中返回 false。可能完全是错误的术语......谢谢。
4 回答
使用;获取锁时,您可以有一个超时。Monitor.TryEnter
同样,在锁中,您可以执行Monitor.Wait
/之类的操作Monitor.Pulse
来暂时放弃锁,但您不能因此被打断。
应用的主要时间中断可能在 Thread.Sleep 中,它可以被 Thread.Interrupt 中断 - 但同样,这不会将控制权从正在执行的方法块中拉出来。
你到底想要达到什么目的?有了更多的上下文,我们可能可以提供更多帮助......
您所说的“中断”是什么意思尚不清楚。
异常中断
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;
}
如果return true
未达到 ,则在foo
保持锁定时发生了一些事情,并且代码返回false
。无论哪种方式,锁都会自动释放。
另一个线程可以通过调用来中断这个Thread.Interrupt
。
代码中的“中断”
如果您是“中断”代码的人,则可能很简单
private bool SomeLockingMethod(object foo)
{
// Verify foo is valid
lock(foo)
{
// Do stuff
if(shouldInterrupt)
{
return false;
}
// Do more stuff
}
return true;
}
同样,无论是否有“中断”,锁都会自动释放。
由于其他人试图获取锁而中断
可能这就是您正在寻找的;在这种情况下,您可能想要使用其他东西,例如 aSemaphore
或ManualResetEvent
。
我不确定你想在这里做什么。该lock
语句的目的是您不应该被打断,这样您就可以确保一致的行为。
你想在这里完成什么?
您可能还会查看 2.0 中添加的事务范围,这可能是您正在寻找的内容(未知,由于您的问题含糊不清)。它允许您尝试一些操作,如果这些操作未正确完成,则回滚。