一個區別是System.Threading.Timer在線程池線程上調度回調,而不是每次都創建一個新線程。如果您在應用程序的生命週期中需要這樣的操作不止一次,這將節省創建和銷燬一堆線程的開銷(這是一個非常耗費資源的進程,正如您參考的文章指出的那樣),因爲它會只是重用池中的線程,並且如果您將同時運行多個計時器,這意味着您將有更少的線程同時運行(同時節省大量資源)。
換句話說,計時器將會更有效率。它也可能更準確,因爲只要您指定的時間量(OS可能使其睡眠時間更長),Thread.Sleep只能保證至少等待。當然,Timer仍不會完全準確,但意圖是儘可能接近指定的時間觸發回調,而這不一定是Thread.Sleep的意圖。
至於銷燬定時器,回調可以接受一個參數,所以你可能能夠傳遞Timer本身作爲參數,並在回調中調用Dispose(雖然我沒有試過這個 - 我想這是回調期間定時器可能被鎖定)。
編輯:不,我想你不能這樣做,因爲你必須在指定Timer構造本身的回調參數。
也許這樣? (再次,還沒有真正嘗試過)
class TimerState
{
public Timer Timer;
}
...並啓動定時器:
TimerState state = new TimerState();
lock (state)
{
state.Timer = new Timer((callbackState) => {
action();
lock (callbackState) { callbackState.Timer.Dispose(); }
}, state, millisecond, -1);
}
鎖定應防止計時器回調從設法釋放之前,定時器,定時器字段已被設置。
附錄:正如評論者指出的那樣,如果行動()做了與UI,然後使用一個System.Windows.Forms.Timer可能是一個更好的選擇,因爲它將運行在UI回調線。但是,如果情況並非如此,那麼Thread.Sleep與Threading.Timer就是Threading.Timer。
也值得指出與System.Windows.Forms.Timer的區別,我相信*在UI線程上調用一個函數,這對WinForms應用程序非常重要! – 2008-12-24 17:13:10
對於未來的讀者,「睡眠」並不是保證至少是事件,據記載它可能更少。 – 2013-04-01 14:04:19
出於好奇......記錄在哪裏? – 2013-04-01 15:05:01