如果先前已获得锁定,如何使用Monitor类和对象锁定来阻止方法执行

时间:2018-12-07 10:40:29

标签: c# .net

我有一个间隔为60秒的计时器,并且在其timer_elapsed事件处理程序中,我正在执行一个方法。我只想在当前调用仍在运行的情况下跳过对方法的下一个调用,只要时间已过去并且对方法的下一个调用已准备就绪。如何使用监视器和对象锁定? 这是我的代码段

private static object lock = new object();
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    Monitor.Enter(lock);
    try
    {
      SomeMethod();
    }
    finally
    {
      Monitor.Exit(lock);
    }
}

如果先前的调用仍在进行中,我只想跳过对方法的整个调用。

1 个答案:

答案 0 :(得分:2)

您可以使用Monitor.TryEnter。此方法尝试获取锁定并返回此操作的结果。它还有一些有用的重载,例如,它可以尝试在指定的超时时间内获取锁。

private static object lock = new object();
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    bool haveLock = false;

    try
    {
        Monitor.TryEnter(lock, ref haveLock);
        if (haveLock)
        {
            SomeMethod(); 
        }
    }
    finally
    {
        if (haveLock)
        {
            Monitor.Exit(lock);
        }
    }
}