Как подписаться на событие и не закрыть приложение?
Добрый день. Хочу сделать небольшое консольное приложение, которое бы ждало каких то действий в системе, появление файла/подключение устройства/потеря интернета и т.д. в данный момент это не важно. Я могу сделать подписку MyClass.MyFunction += System.SomeEvent Но после этого управляющий поток идет дальше и приложение закрывается. Вопрос, как оставить приложение работать и при этом не потреблять много ресурсов?
P.S. While (true) {...} и Thread.Sleep забирают около 20% работы процессора
а зачем Thread.Sleep? Вы как раз поток притормаживаете, вот и нагрузка, просто бесконечный цикл и все. Лучше думаю вызывать даже Thread.Yield, чтобы чтобы не занимать процессор постоянно потоком.
Роман, Thread.Sleep не нагружает, а наоборот разгружает поток. Достаточно даже Sleep(1), чтоб нагрузка спала на нет. А Yield переключает поток сразу на другой. Переключение - это процессорное время.
Зачем делать это на C#. используйте C++, потому-что в любом случае вам придется подключать функции WinAPI, создавать эти структуры, это неудобно делать на C#. А сам язык нужного функционала вам не даст.
Роман, я знаю что делает Sleep, а вот ты видимо нет. Да, Sleep тормозит поток и именно этим снимает нагрузку, т.к. происходит переключение потоков в ОС до момента истечения времени. И это время не считается как затраченное на работу.
На сколько ты ставишь Sleep?
Untiwe, Если вам надо что бы приложение сидело в стелс режиме и что то делало:
1. можно сделать в виде windows-сервиса
2. можно сделать WinForms приложение (с Wpf не работал не знаю) убрать кнопку приложения с панели задач и добавить иконку в трей.
Оба варианта не сложны в исполнении. Второй чуть попроще.
Кстати, у winforms же как то получается "ничего не делать и не закрываться" Интересно, можно ли перенести этот механизм к себе? Вы, наверно, не ответите, так что это просто мысли в слух)
А так, да, мысль задавая)