我認爲這將做的工作適合你:
static void Main(string[] args)
{
StartTimer(TimeSpan.FromMinutes(20.0), "TimerA", true);
StartTimer(TimeSpan.FromMinutes(30.0), "TimerB", true);
StartTimer(TimeSpan.FromMinutes(45.0), "TimerC", true);
Console.WriteLine("Press any key to exit...");
Console.ReadLine();
}
啓動定時器功能啓動定時器,並返回它(如果你需要參考)。這裏的關鍵是你給它定時器名稱,並告訴它是否要將定時器對準整個小時。如果你不想對準整個小時,那麼定時器將立即以指定的頻率啓動。
public static Timer StartTimer(TimeSpan frequency, string timerName, bool alignToHour)
{
if (alignToHour)
{
return new Timer(OnTimerTick, timerName, ComputeDelay(frequency), frequency);
}
else
{
return new Timer(OnTimerTick, timerName, TimeSpan.Zero, frequency);
}
}
當計時器滴答時將被觸發的函數。
public static void OnTimerTick(object state)
{
Console.WriteLine((string)state + " " + DateTime.Now.ToString("H:mm"));
}
此方法計算如果定時器必須在整小時對齊時所需的延遲。它只適用於頻率小於1小時或超過1分鐘的情況。
public static TimeSpan ComputeDelay(TimeSpan frequency)
{
if (frequency > TimeSpan.FromHours(1.0) ||
frequency < TimeSpan.FromMinutes(1.0))
{
throw new ArgumentException(
"The frequency cannot be more than one hour or less than one minute!");
}
return frequency - TimeSpan.FromMinutes(DateTime.Now.Minute % frequency.Minutes);
}
注:在您的示例運行在1小時頻率45分鐘計時器,但你上20次分鐘和30分鐘的頻率(分別)運行20倍分鐘和30分鐘的定時器。我的代碼在1小時的頻率上無法使用45分鐘的定時器,但它在各自的頻率上使用20,30和45分鐘的定時器。我不確定你的例子是否錯誤,但如果沒有錯,那麼我認爲你應該能夠弄清楚如何從這裏處理這種差異。
你能解釋一下你想做什麼嗎? –
@Snowy,你在用什麼編程語言? 。淨?此外,在你的例子中,計時器C每小時執行一次,而不是每45分鐘執行一次......那是你真正想要的嗎? – Kiril
只使用一個計時器,以便它們永遠不會分開。將其設置爲下一個到期間隔,然後梳理需要完成的工作。總是從時鐘計算時間間隔,不要增加一個增量,因爲它總是會漂移很晚。 –