我有一个间隔为 60 秒的计时器,在它的 timer_elapsed 事件处理程序中,我正在执行一个方法。如果当前调用仍在运行,我只想跳过对方法的下一次调用,前提是时间已经过去并且下一次调用方法已准备就绪。如何使用 Monitor 和 object lock 来做到这一点? 这是我的代码片段
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);
}
}
如果之前的调用仍在进行中,我只想跳过对方法的整个调用。
最佳答案
您可以使用 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);
}
}
}
关于c# - 如果先前已获取锁,如何使用 Monitor 类和对象锁来防止方法执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53667844/