如果您使用System.Timers.Timer,關閉AutoReset。然後在Elapsed方法結束時重新啓用計時器。
private void timerDoJob_Elapsed(object sender, ElapsedEventArgs e)
{
VeryLongTask1();
VeryLongTask2();
VeryLongTask3();
mytimer.Enabled = true;
}
這樣,定時器甚至不會再次啓動,直到任務完成。但是請確保在try/catch塊中的Elapsed方法中包含所有內容,因爲如果發生未處理的異常,您的計時器將不會再次啓動。
我以前用過的另一種方法是在你經過的事件,使用鎖:
var myLock = new Object();
private void timerDoJob_Elapsed(object sender, ElapsedEventArgs e)
{
lock (myLock) {
VeryLongTask1();
VeryLongTask2();
VeryLongTask3();
}
}
這樣,經過的事件的兩個實例不能在同一時間運行。但是,有一點需要注意:如果任務需要比定時器的兩次或更多次迭代更長的時間,則可以在後臺添加迭代。例如,如果您的計時器在5秒後過去了,但您的任務需要60秒才能完成,但在第一次完成時,您將有11次等待。
你問,如果它怎麼取消任務會持續太久? –
@SamIam不,我不是。其實任務應該及時完成,但下一次計時器的迭代不應該破壞以前的東西。 –