簡體   English   中英

只能每X秒運行一次內部代碼的委托

[英]Delegate that can run internal code only every X seconds

我試圖制作一個方法,該方法將返回一個可以每毫秒調用一次的委托,但我想限制它運行的速度不是每次調用時都慢,而是說每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秒內一直被調用。

您能否說出第一種方法有什么問題,或者可以建議一種更好的方法?

您在這里實際上不需要任何計時器,只需記住上一次執行函數的時間即可:

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;
    };
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM