C#中可中断锁的语法

时间:2009-03-03 01:19:46

标签: c# locking interrupt

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

4 个答案:

答案 0 :(得分:2)

使用Monitor.TryEnter 查询锁定时,您可以暂停同样,在一个锁中你可以做Monitor.Wait / Monitor.Pulse之类的事情暂时产生锁定,但你不能这样打断。

应用的主时间中断可能在Thread.Sleep中,可以通过Thread.Interrupt中断 - 但同样,这不会将控制权从执行的方法块中拉出来。

你想要实现的是什么?有了更多的背景,我们可以帮助更多...

答案 1 :(得分:1)

“中断”的意思不清楚。

异常中断

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;
 }

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

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

这可能就是你要找的东西;在这种情况下,您可能需要使用其他内容,例如SemaphoreManualResetEvent

答案 2 :(得分:0)

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

你想在这里完成什么?

答案 3 :(得分:0)

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

See here了解详情。