Сведения о вопросе

rjevskii

16:03, 1st July, 2020

Теги

c#   .net   vb.net   timer    

Надежный таймер в консольном приложении

Просмотров: 488   Ответов: 2

Я знаю, что в .NET есть три типа таймеров (см. сравнение классов таймеров в библиотеке классов фреймворка .NET ). Я выбрал потоковый таймер, поскольку другие типы могут дрейфовать, если основной поток занят, и мне нужно, чтобы это было надежно.

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

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

Я попробовал добавить цикл while true , но тогда основной поток слишком занят, когда таймер действительно выключается.



  Сведения об ответе

nYU

18:03, 1st July, 2020

Вы можете использовать что-то вроде Console.ReadLine() , чтобы заблокировать основной поток, поэтому другие фоновые потоки (например, потоки таймера) все равно будут работать. Вы также можете использовать AutoResetEvent для блокировки выполнения, а затем (когда это необходимо) вы можете вызвать метод Set() для этого объекта AutoResetEvent, чтобы освободить основной поток. Также убедитесь, что ваша ссылка на объект Timer не выходит за пределы области действия и не собирается мусор.


  Сведения об ответе

$DOLLAR

18:03, 1st July, 2020

Рассмотрите возможность использования ManualResetEvent для блокирования основного потока в конце его обработки и вызовите Reset() по нему, как только обработка таймера завершится. Если это что-то, что нужно постоянно запускать, подумайте о том, чтобы переместить это в процесс обслуживания вместо консольного приложения.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться