我在我的程序中使用了System.Timers
。如果前一個線程仍在運行,我該如何強制系統等待創建新線程?
正如我們所知道的每個區間創建新線程來處理OnTimedEvent
。
我正在尋找方法來強制系統等待創建一個新的線程,如果前一個線程仍在運行。
我OnTimedEvent
執行一些方法,我想等到結束該方法
任何想法如何做到這一點?
我在我的程序中使用了System.Timers
。如果前一個線程仍在運行,我該如何強制系統等待創建新線程?
正如我們所知道的每個區間創建新線程來處理OnTimedEvent
。
我正在尋找方法來強制系統等待創建一個新的線程,如果前一個線程仍在運行。
我OnTimedEvent
執行一些方法,我想等到結束該方法
任何想法如何做到這一點?
您錯誤地認爲在啓動Elapsed
事件時不會創建新線程。該事件將在.NET線程池中引發,因此任意線程都會處理它。
一種方法可以做到你想要的是Stop
在你的事件處理程序開始時的計時器和Start
一旦它完成。像這樣:
var timer = new System.Timers.Timer(1000);
timer.Elapsed += HandleTimerElapsed;
timer.Start();
...
private void HandleTimerElapsed(object s, ElapsedEventArgs e)
{
var t = (System.Timers.Timer)s;
t.Stop();
try {
... do some processing
}
finally { // make sure to enable timer again
t.Start();
}
}
另一種方法是將計時器的AutoReset
屬性設置爲false。這樣計時器只會升起一次。然後,您可以在需要重新開始時撥打Start
。因此,上面的代碼會在開始時更改爲包含timer.AutoReset = false;
,然後您不需要在處理程序中調用Stop
。這更安全一些,因爲上面的方法可能有競爭條件,因爲如果系統處於加載狀態,那麼在定時器再次運行之前,處理程序可能無法保證執行。
非常好Idea-謝謝! – MoShe 2012-04-07 20:06:51
thread.Join()//在此等待,直到線程完成。 http://stackoverflow.com/questions/1584062/how-to-wait-for-thread-to-finish-with-net – MrFox 2012-04-07 19:48:49
你必須使用計時器嗎?你能不能簡單地循環線程,並最終計算出下一次運行需要多少毫秒,如果是正數,那麼該時間睡眠? – 2012-04-07 19:59:24
@Martin詹姆斯 - 我使用這個應用程序作爲Windows服務,所以我想使用計時器和noe while(true)循環,@ MrFox,因爲我說我使用計時器... – MoShe 2012-04-07 20:04:50