Как запустить таймер в отдельном потоке?

У меня есть петля, как показано ниже

for(int i = 0; i < 10; i++)
{
    // some long time processing
}

Я хочу создать таймер, который будет проверять, выполняется ли одна обработка более 5 минут. Если одна обработка выполняется более 5 минут, текущая обработка будет остановлена, а затем запущена другая обработка.

Можно ли создать еще один поток для мониторинга основного цикла?

Моя программа представляет собой консольное приложение.


person Yongwei Xing    schedule 15.12.2009    source источник


Ответы (4)


вам следует использовать System.Timers.Timer

person Fredou    schedule 15.12.2009
comment
На самом деле это System.Timers.Timer - person Alex Bagnolini; 15.12.2009
comment
в чем разница между System.Timers.timer и System.Threading.Timer - person Yongwei Xing; 15.12.2009
comment
System.Timers.Timer — это версия System.Threading.Timer IComponent (дизайнер с перетаскиванием) — mark.michaelis.net/Блог/ - person Richard Szalay; 15.12.2009
comment
@ Ричард, нет, это form.timers - person Fredou; 15.12.2009
comment
@Yongwei, я бы сказал, что timers.timer, но могу ошибаться - person Fredou; 15.12.2009
comment
@ Фреду, я думаю, ты прав, я провел простой тест. Это здорово. - person Yongwei Xing; 15.12.2009
comment
@Fredou, Form.Timers не запускается в потоке пользовательского интерфейса. System.Timers.Timer расширяет компонент и, таким образом, доступен для перетаскивания. - person Richard Szalay; 15.12.2009
comment
@richard, я могу ошибаться, но я думаю, что forms.timer будет ждать, если пользовательский интерфейс зависнет, а не system.timers.timer - person Fredou; 15.12.2009
comment
Timers.Timer и Threading.Timer выполняются в отдельном потоке (не в потоке пользовательского интерфейса). Тем не менее, Timers.Timer расширяет Component, поэтому он по-прежнему доступен для перетаскивания в среде времени разработки. - person Richard Szalay; 15.12.2009
comment
@richard, я только что попробовал с form.timers, и он игнорирует поток пользовательского интерфейса, если он зависает. виноват - person Fredou; 15.12.2009
comment
я сейчас смотрю на оба в отражателе, чтобы посмотреть, как они работают - person Fredou; 15.12.2009
comment
Объяснение различных типов таймеров: msdn.microsoft.com/en-us/ журнал/cc164015.aspx - person Oliver; 15.12.2009
comment
Это НЕ работает и не отвечает на вопрос о том, как создать таймер во втором потоке. - person john ktejik; 25.02.2014

Взгляните на ManualResetEvent и, в частности, WaitOne.

person Jamiec    schedule 15.12.2009

В дополнение к ответу Джейми вы можете использовать System.Threading.Timer, который будет выполняться в фоновом потоке.

person Richard Szalay    schedule 15.12.2009

Тем не менее, вы все еще не можете прервать работающий код. Сам код должен обеспечивать возможность самоотмены, которую может вызвать таймер через определенное время.

Например, вы можете использовать логическое значение «shouldCancel», которое вы проверяете на каждой итерации вашего цикла (или даже несколько раз).

"Плохой" способ - использовать Thread.Abort, однако это не очень хороший стиль.

person Matthias    schedule 15.12.2009