Надежный таймер в консольном приложении - PullRequest
87 голосов
/ 01 августа 2008

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

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

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

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

Ответы [ 2 ]

52 голосов
/ 01 августа 2008

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

17 голосов
/ 01 августа 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...