我會做一個計時器,行爲是這樣的:定時器殺死任務/工作,如果它的運行速度比計時器時間間隔較長
如果處理任務/作業的時間小於定時間隔,啓動計時器(timer.interval - 處理時間工作/工作)
如果處理作業的時間/任務比計時器間隔多,開始立刻
代碼下面的作品接下來的工作/任務,但我想如T知道爲什麼必須首先完成ElapsedEventHandler方法作業/任務,然後我們可以設置新的計時器間隔。時間間隔過去後引發System.Timers.Timer事件。使用AutoReset = false選項,我們設置Timer在第一個時間間隔過後僅提升Elapsed事件一次。我們必須手動調用Timer.Start()來重新啓動它。
using System;
using System.Timers;
namespace TestTimer
{
class Program
{
private static Timer t;
private static double intervalMiliseconds;
static void Main(string[] args)
{
intervalMiliseconds = 5000; // 5 seconds
t = new Timer();
t.Interval = intervalMiliseconds;
t.AutoReset = false;
t.Elapsed += new ElapsedEventHandler(OnTimedEvent);
t.Start();
log("Timer started at " + DateTime.Now.ToString());
log("Interval is: " + defaultIntervalMiliseconds);
Console.ReadKey();
}
private static void log(string text)
{
Console.WriteLine(text + "\n");
}
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
// if t.Interval is set here thread just kills the job if it
// runs longer than interval
t.Interval = intervalMiliseconds;
log("ElapsedEvent triggered at " + DateTime.Now.ToString());
// job
DateTime startTime = DateTime.Now;
log("job started");
System.Threading.Thread.Sleep(8000); // 8 sec
log("job ended");
TimeSpan jobTime = DateTime.Now.Subtract(startTime);
log("job took " + jobTime.TotalSeconds + " seconds");
// if we set t.Interval here it works so first the job
// must be done and than we can set timer interval ? why ?
//t.Interval = intervalMiliseconds;
if (jobTime.TotalMilliseconds < t.Interval)
{
t.Interval = t.Interval - jobTime.TotalMilliseconds;
log("Job ended Earlier starting Event in: " + t.Interval);
}
else
{
t.Interval = 100;
log("Job overpass interval. Current time: " +
DateTime.Now.ToString());
}
t.AutoReset = false;
t.Start();
}
}
}
結果呢:
如果我們方法OnTimedEvent並取消t.Interval的工作之後開始評論t.Interval所做的一切工作。這個結果:
爲什麼我們不能在方法OnTimedEvent開始設置計時器的時間間隔。如果我們這樣做,如果任務/作業的運行時間超過了定時器時間間隔,線程就會殺死作業。我真的很感激,如果有人有一些想法?這是否與線程與主線程(哪個定時器運行)的synhronization有關?當我們調用方法OnTimedEvent時,定時器不會再次調用該方法,因爲它具有AutoReset = false,它與我們設置定時器屬性的位置有什麼不同?
雖然我還沒有讀過你的整個問題,但爲什麼不在工作_start_上啓動計時器。作業完成後,如果計時器已過,則啓動另一個作業,否則等待計時器過去。 –