簡體   English   中英

如何每分鍾調用一種方法,但要考慮到該方法處理所花費的時間可能不止一個?

[英]How to call a method every minute but take into account the time it takes for that method to process might take more than one?

我正在使用Windows服務,我想每分鍾從OnStart調用一個方法。 我最初有一個forever循環,但隨后該服務無法安裝。

while (true)
{
    Stopwatch stopWatch = new Stopwatch();
    int totalTime = 0;
    stopWatch.Start();

    MethodToCall();

    stopWatch.Stop();
    // Get the elapsed time as a TimeSpan value.
    TimeSpan ts = stopWatch.Elapsed;
    totalTime = ts.Seconds * 1000 + ts.Milliseconds;

    if (totalTime < 60000)
    {
        Thread.Sleep(60000 - totalTime);
        //ManualResetEvent.WaitOne(10000);
    }
    else
    {
        Thread.Sleep(30000);
    }
}

因此,當方法超過一分鍾時,如何使我的方法每分鍾調用一次,但是它將等待N分鍾(比如30秒),然后通過調用該方法重新開始。

這樣的事情應該起作用。 AutoReset標志設置為false的情況下,計時器將在指定的interval時間后僅觸發一次。 finally塊中,我們確保重新啟動計時器倒計時,等待間隔再次過去。

var interval = TimeSpan.FromMinutes( 1 );
var timer = new System.Timers.Timer( interval.TotalMilliseconds ) { AutoReset = false };
timer.Elapsed += ( sender, eventArgs ) =>
{
    var start = DateTime.Now;
    try
    {
        // do work
    }
    finally
    {
        var elapsed = DateTime.Now - start;
        if ( elapsed < interval )
            timer.Interval = (interval - elapsed).TotalMilliseconds;
        else
            timer.Interval = TimeSpan.FromSeconds( 30 ).TotalMilliseconds;
        timer.Start();
    }
};
timer.Start();

Timer.Elapsed來源(請注意有關設置Interval重置倒計時的位)

有兩種解決方案,取決於您的需求。 您是否想每分鍾一分鍾做一次工作,並且總是等到下一分鍾? 或者,您是否希望每分鍾不超過一次運行,但是如果落后則可以“追上”嗎?

換句話說,如果處理需要80秒,那么下一個工作會立即開始還是等待直到T = 120?

第一個比較容易,但是請注意,我尚未對此進行測試,它只是一個准則:

AutoResetEvent waitHandle = new AutoResetEvent(false);
System.Timer(() => waitHandle.Set(), null, TimeSpan.FromMinutes(1), TimeSpan.FromMilliseconds(-1));

while (true)
{
  // Do stuff
  waitHandle.WaitOne();
}

第二個有點難。

ManualResetEvent waitHandle = new ManualResetEvent (false);
System.Timer(() => waitHandle.Set(), null, TimeSpan.FromMinutes(1), TimeSpan.FromMilliseconds(-1));

while (true)
{
  // Do stuff
  waitHandle.Reset();
  waitHandle.WaitOne();
}

暫無
暫無

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

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