只能每隔X秒运行内部代码的委托

时间:2014-02-12 17:36:16

标签: c# loops timer

我正在尝试创建一个方法,该方法将返回一个可以每毫秒调用一次的委托,但是我想限制它运行慢速操作,而不是每次调用它时,但是在5秒钟内说最少一次。

尝试使用Timer和Stopwatch实现这一目标,但无法坚持使用经济实惠的解决方案。

第一种方法:

public Func<bool> GetCancelRequestedFunc(string _taskName)
{
    var checkStatus = false;
    var timer = new Timer(5000);
    timer.Elapsed += (sender, args) => { checkStatus = true; };

    return () =>
    {
        if (checkStatus)
        {
            bool result;
            checkStatus = false;

            //long operation here

            return result;
        }

        return false;
    };
}

第一种方法对我来说似乎更好但是它不起作用 - 这里的长期操作从未被调用过,我无法找出原因。可能需要将checkStatus作为ref传递,但在这种情况下不确定如何制作

第二种方法:

public Func<bool> GetCancelRequestedFunc(string _taskName)
{
    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();

    return () =>
    {
        var mod = stopwatch.ElapsedMilliseconds % 5000;     
        if (mod > 0 && mod < 1000)
        {
            bool result;

            //long operation here

            return result;
        }

        return false;
    };
}

这个有用...但非常不可靠,因为如果调用委托,似乎在第6秒执行检查。但是它会在第6秒内一直被调用。

你能说出第一种方法有什么问题,或者建议更好吗?

1 个答案:

答案 0 :(得分:1)

这里你真的不需要任何计时器,只记得上次执行你的功能的时间:

public Func<bool> GetCancelRequestedFunc(string taskName)
{
    DateTime lastExecution = DateTime.Now;

    return () =>
    {
        if(lastExecution.AddMinutes(5)<DateTime.Now) 
        {
            lastExecution = DateTime.Now;
            bool result;

            //long operation here

            return result;
        }

        return false;
    };
}