我有一个System.Threading.Timer,它经常触发(为简单起见,每秒钟触发一次),在CallBack中,我需要调用一个Action(它通过构造函数传入,因此位于另一个类中),在其中进行一些处理(假设需要2秒钟以上的时间),如何防止多次调用我的处理逻辑?似乎在Action调用中lock()不起作用? 我正在使用.net 3.5。

public TestOperation(Action callBackMethod)
{
    this.timer = new System.Threading.Timer(timer_Elapsed, callbackMethod, timerInterval, Timeout.Infinite);
}

private void timer_Elapsed(object state)
{
    Action callback = (Action) state;
    if (callback != null)
    {
        callback();
    }
}

// example of the callback, in another class.
private void callBackMethod()
{
    // How can I stop this from running every 1 second? Lock() doesn't seem to work here
    Thread.Sleep(2000);
}

谢谢!

最佳答案

解决这个问题几乎没有什么可做的。请注意,使用锁是一个非常糟糕的主意,当回调持续​​花费太多时间时,它将使您的线程池爆炸。加载机器时,这很容易发生。使用Monitor.TryEnter()是安全的选择。绝对也不漂亮,您将任意丢失回调。

如果仅将period参数设置为0,则它​​会更容易实现。因此,计时器只能计时一次。现在,您将自动保证不能重新输入该回调。您所要做的就是在方法末尾调用Change()以重新启动计时器。您可以选择使用固定值,也可以根据实际的过期时间计算新的DueTime值,这是合理的选择。

09-28 01:49
查看更多