Надійний таймер у консольному додатку


102

Мені відомо, що в .NET є три типи таймерів (див. Порівняння класів таймерів у бібліотеці .NET Framework Class ). Я вибрав різьбовий таймер, оскільки інші типи можуть переміщатися, якщо основний потік зайнятий, і мені це потрібно для надійності.

Те, як цей таймер працює в управлінні таймером, надівається на інший потік, тому він завжди може поставити галочку разом із завершеною роботою над батьківським потоком, коли він не зайнятий.

Проблема з цим таймером у консольній програмі полягає в тому, що, коли таймер тикає на іншій потоці, головний потік нічого не робить, щоб програма закривалася.

Я спробував додати while trueцикл, але тоді головна нитка занадто зайнята, коли таймер дійсно вимикається.

Відповіді:


59

Ви можете використовувати щось на кшталт Console.ReadLine()блокування основної нитки, тому інші фонові потоки (наприклад, теми таймеру) все ще працюватимуть. Ви також можете використовувати AutoResetEvent для блокування виконання, тоді (коли це потрібно) ви можете викликати метод Set () на цьому об'єкті AutoResetEvent, щоб звільнити основний потік. Також переконайтеся, що ваша посилання на об'єкт Timer не виходить за межі та зібраний сміття.


20

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.