2011-08-10 31 views
0

我有一個慢方法,而在計時器(System.Timers.Timer)上執行它。它有時比計時器的超時執行時間長,這會導致計時器等待。我希望在30ms後爲30ms設置定時器,以重置方法,而不是等待。我應該使用什麼樣的計時器?如何使超時計時器

編輯:

void OnTimerElapsed() { 
     SomeMethod(args1); 
     SomeMethod(args2); 
     SomeMethod(args3); 
} 

的someMethod位於另一組件。這是從另一個應用程序請求數據的同步方法。我不知道它爲什麼有時會掛起。這會導致計時器暫停,直到SomeMethod()繼續。

+1

什麼是「重置方法」應該是什麼意思?當然你不是在談論Thread.Abort? –

+0

是的,我想在計時器超時後中止操作。 – blez

+0

FWIW由於您不知道如何從可能的錯誤狀態中恢復,處置資源等,因此中止線程被認爲是非常糟糕的做法。 – drharris

回答

1

使用System.Timers.Timer並將其AutoReset設置爲false,並且只在上一次完成時或在您的自定義條件下啓動它。下面是我用的模式:

private System.Timers.Timer _timer = new System.Timers.Timer(); 
private volatile bool _requestStop = false; 

private void InitializeTimer() 
{ 
    _timer.Interval = 100; 
    _timer.Elapced += OnTimerElapced; 
    _timer.AutoReset = false; 
    _timer.Start(); 
} 

private void OnTimerElapced(object sender, System.Timers.TimerEventArgs e) 
{ 
    //_timer.Stop();//if AutoReset was not false 

    //do work.... 

    if (!_requestStop) 
    { 
     _timer.Start();//restart the timer 
    } 
} 

private void Stop() 
{ 
    _requestStop = true; 
    _timer.Stop(); 
} 

private void Start() 
{ 
    _requestStop = false; 
    _timer.Start(); 
} 

編輯:手錶計時器。如果你喜歡,如果操作需要較長的時間,那麼你不應該擺在首位使用計時器,而是使用包住在新線程中操作並使用MaunalResetEvent,使用其WaitOne方法指定超時,如果超時發生則停止或關於該操作。

+0

使用System.Timers.Timer使OP的問題明顯變得更糟,他將有多個線程執行OnTimerElapsed。非常非常糟糕。 –

+0

好的,但如果「做功」需要很長時間才能完成,它也會掛起,直到它檢查請求停止 – blez

+0

@blez我編輯了答案以指定替代解決方案。 –