Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top