我有一个间隔为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);
}
}
如果先前的调用仍在进行中,我只想跳过对方法的整个调用。
答案 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);
}
}
}