2016-08-30 77 views
0

比方說,我有這樣的代碼停止一個System.Timers.Timer

public static Timer timer; 

static void Main() 
{ 
    timer = new Timer (60 * 1000); // It ticks every minute 
    timer.Elpased += One; 
    timer.Elapsed += Two; 
} 

private static void One (sender o, EventArgs e) 
{ 
    timer.Stop(); 
} 

private static void Two (sender o, EventArgs e) 
{ 
    DoSomething(); 
} 

因爲我假設「一」和「二」將執行認購順序,在「一」停止計時器會防止'兩'發生?

如果不是,我該怎麼辦?

+1

檢查兩個計時器狀態 –

+0

當你調用'timer.Elapsed - = One'時,那麼'Two'仍然會執行,因爲它會移除'One'的委託,但不會在其中運行代碼。 – Edgar

+0

@EdgarsŠturms是的,但打電話timer.Elapsed - =兩個一個不會停止兩個執行 – marsh

回答

1

System.Threading.Timer沒有Elapsed事件。它需要傳遞給構造函數的單個TimerCallback委託,它在ThreadPool線程上執行。

https://msdn.microsoft.com/en-us/library/system.threading.timer(v=vs.110).aspx

我相信你正在尋找System.Timers.Timer,裏面確實有一個Elapsed事件。

https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx

我不相信有一種方法來保證的方式,以防止Two從射擊你描述的方式。您必須假設OneTwo在2個不同的線程上完全同時執行。即使撥打Stop()也不能保證防止計時器發出額外的時間:https://msdn.microsoft.com/en-us/library/system.timers.timer.stop(v=vs.110).aspx

我的建議是,在One中的邏輯執行後,如果它應該執行Two中的操作,那麼我的建議是處理分支邏輯。

+0

是的,我錯過了,我使用System.Timers(已編輯),我認爲分支邏輯是我最好的辦法,我只是認爲可能有辦法阻止它。反正ty – marsh