0

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

4

4 回答 4

2

使用;获取锁时,您可以有一个超时。Monitor.TryEnter同样,在锁中,您可以执行Monitor.Wait/之类的操作Monitor.Pulse来暂时放弃锁,但您不能因此被打断。

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

你到底想要达到什么目的?有了更多的上下文,我们可能可以提供更多帮助......

于 2009-03-03T01:36:22.370 回答
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;
 }

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

由于其他人试图获取锁而中断

可能这就是您正在寻找的;在这种情况下,您可能想要使用其他东西,例如 aSemaphoreManualResetEvent

于 2009-03-03T01:22:03.560 回答
0

我不确定你想在这里做什么。该lock语句的目的是您不应该被打断,这样您就可以确保一致的行为。

你想在这里完成什么?

于 2009-03-03T01:26:46.200 回答
0

您可能还会查看 2.0 中添加的事务范围,这可能是您正在寻找的内容(未知,由于您的问题含糊不清)。它允许您尝试一些操作,如果这些操作未正确完成,则回滚。

有关更多详细信息,请参见此处

于 2009-03-03T03:39:48.877 回答