我怀疑这是一个非常愚蠢的问题:C#中可中断锁语句的正确语法是什么?例如。得到锁;如果在锁定代码完成之前锁定被中断,则从封闭方法返回false。可能完全是错误的术语......谢谢。

有帮助吗?

解决方案

使用 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

<强>&QUOT;中断&QUOT;来自代码

如果你是那个“打断”的人代码,它可以像

一样简单
private bool SomeLockingMethod(object foo)
{
    // Verify foo is valid

    lock(foo)
    {
       // Do stuff

       if(shouldInterrupt)
       {
          return false;
       }

       // Do more stuff
    }

    return true;
 }

同样,无论是否存在“中断”,锁都会自动释放。

因为其他人试图获取锁定而导致中断

这可能就是你要找的东西;在这种情况下,您可能想要使用其他内容,例如 <代码>信号量 ManualResetEvent的

我不确定你想要在这里得到什么。 lock 语句的目的是不应该中断,这样可以确保一致的行为。

你想在这里完成什么?

您可能还要查看在2.0中添加的事务范围,这可能是您正在寻找的事项(由于您的问题含糊不清,因此未知)。它允许您尝试某些操作,然后在这些操作未正确完成时回滚。

请点击此处了解更多详情。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top