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

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

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

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

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

Ответ 1

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

Ответ 2

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