2016-06-28 3 views
1

У меня есть экземпляр System.Timers.Timer, созданный в основном потоке. Теперь я вызываю timer.Stop(), чтобы попытаться завершить это время и хочу подождать, пока таймер действительно не будет завершен. Как я мог это сделать?.Net: как подождать, пока System.Timers.Timer остановится

Есть ли какой-либо подобный метод, например System.Threading.Thread.Join()?

Вот некоторые коды

//the main thread: 
var aTimer = New Timer(); 
aTimer.Elapsed += SomeTimerTask; 
aTimer.AutoReset = True; 
aTimer.Start(); 

//some other logic... 

//stop that timer: 
aTimer.Stop(); 

//now I need to wait until that timer is really stopped, 
//but I cannot touch the method SomeTimerTask(). 
//so I need something like System.Threading.Thread.Join()... 
+0

https://msdn.microsoft.com/en-us/library/system.timers.timer.stop(v=vs.110).aspx имеет образец кода, который показывает, как избежать этой точной проблемы. – paxdiablo

+0

Что бы вы действительно хотели сделать, чтобы событие Elapsed не запускалось снова. Вы не можете получить такую ​​гарантию, [вам нужно будет проверить] (http://stackoverflow.com/a/4810724/17034) в обработчике событий. Однако рассмотрите System.Threading.Timer, его перегрузка Dispose (WaitHandle) обеспечивает гарантию. –

ответ

1

Вы могли бы сделать использование ResetEvents, которые ожидания ручки, которые могут блокировать поток до тех пор, пока не будут установлены состояния в сигнальное:

class TimerAndWait 
{ 
    private ManualResetEvent resetEvent = new ManualResetEvent(false); 

    public void DoWork() 
    { 
     var aTimer = new System.Timers.Timer(5000); 
     aTimer.Elapsed += SomeTimerTask; 
     aTimer.Elapsed += ATimer_Elapsed; 
     aTimer.AutoReset = true; 
     aTimer.Start(); 

     // Do something else 

     resetEvent.WaitOne(); // This blocks the thread until resetEvent is set 
     resetEvent.Close(); 
     aTimer.Stop(); 
    } 

    private void ATimer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     resetEvent.Set(); 
    } 
} 

Если вы хотите/задачи на основе решения асинхронной вы должны использовать ThreadPool.RegisterWaitForSingleObject метод

0

Таймер не разжигать Elapsed при вызове остановки, как вы можете прочитать в docs из Stop() -метода:

Остановки повышения Истекшей событие, установив Enabled в значение false.

The Прошедшее -Event срабатывает только тогда, когда в Timer сек Enabled -Property устанавливается в true и данное Interval (который вы должны установить) истекло (это может произойти несколько раз).

Итак, если вы остановите свой таймер до истечения интервала, вам может потребоваться запустить ваш код другим способом.

Смежные вопросы