c# - 如果先前已获取锁,如何使用 Monitor 类和对象锁来防止方法执行

标签 c# .net

我有一个间隔为 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/

相关文章:

c# - 为 WebSocket 响应选择缓冲区大小

c# - 如何在 C# 中访问属性或 const 的 Description 属性?

c# - Selenium WebDriver C# 测试脚本中不存在 ChromeDriver

c# - 带静态值的单元测试

C#|将远程桌面作为进程启动+在文本框中放置文本

c# - csv 文件名在使用 Microsoft.Jet.OLEDB.4.0 提供程序读取时是否需要特定模式?

.net - F# System.Random 重复值

c# - 暂停和恢复线程

c# - 如何重新生成 Resource.designer.cs 文件 Xamarin Android

c# - 带有 Firebird 的 NHibernate ...是否启用了这些功能?