[英]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();
有兩種解決方案,取決於您的需求。 您是否想每分鍾一分鍾做一次工作,並且總是等到下一分鍾? 或者,您是否希望每分鍾不超過一次運行,但是如果落后則可以“追上”嗎?
換句話說,如果處理需要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.