2013-01-08 67 views

回答

4

System.Threading.Timer見備註:

由定時器執行應該是折返回調方法,因爲 它呼籲線程池線程。如果定時器間隔爲 小於執行回調所需的時間,或者所有線程 池線程正在使用且回調隊列多次排隊,則可以在兩個線程池線程上同時執行回調 。

所以對於System.Threading.Timer的答案是否定的

+0

所以,如果我理解正確..第一個回調將發生在一個線程和第二個等將發生在不同的? – Rushino

+0

@Rushino潛在的。它們涉及線程池中的單獨項目,因此它們可能會或可能不會由同一個物理線程處理。 – Servy

+0

不一定。它可能在回調方法完成之前通過相同的[ThreadPool](http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx)線程完成,然後再次調用它。 – Clemens

4

正如@Clemens說,System.Threading.Timer只是不斷滴答!

如果你要防止重入,您可以使用Monitor,或像這只是一個標誌:

int _TimerLock = 0; 

void TimerTickSafe(object state) 
{ 
    if (Interlocked.CompareExchange(ref _TimerLock, 1, 0) != 0) return; 
    try 
    { 
     TimerTick(); 
    } 
    finally 
    { 
     Interlocked.Exchange(ref _TimerLock, 0); 
    } 
} 

如果計時器再次蜱而以前的滴答仍在運行,新的蜱會悄無聲息忽略。