2008-08-01 7 views
75

Я знаю, что в .NET существует три типа таймера (см. Comparing the Timer Classes in the .NET Framework Class Library). Я выбрал поточный таймер, поскольку другие типы могут дрейфовать, если основной поток занят, и мне нужно, чтобы это было надежным.Надежный таймер в консольном приложении

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

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

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

ответ

48

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

15

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

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