Дружественный к процессору бесконечный цикл - PullRequest
52 голосов
/ 13 сентября 2011

Запись бесконечного цикла проста:

while(true){
    //add whatever break condition here
}

Но это снизит производительность процессора.Этот поток выполнения будет максимально использовать мощность процессора.

Каков наилучший способ снизить воздействие на процессор?Добавление некоторого Thread.Sleep(n) должно помочь, но установка высокого значения времени ожидания для метода Sleep() может указывать на не отвечающее приложение в операционной системе.

Допустим, мне нужно выполнять задачу каждую минуту или около того вконсольное приложение.Мне нужно, чтобы Main() работал в «бесконечном цикле», пока таймер сработает, выполнив эту работу.Я хотел бы сохранить Main() с минимальным воздействием на процессор.

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

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ:

Я хочу объяснить лучшечто я ищу:

  1. Мне нужно консольное приложение, а не служба Windows.Консольные приложения могут имитировать службы Windows в системах Windows Mobile 6.x с помощью Compact Framework.

  2. Мне нужен способ сохранить приложение живым, пока работает устройство Windows Mobile.

  3. Мы все знаем, что консольное приложение работает до тех пор, пока работает его статическая функция Main (), поэтому мне нужен способ предотвратить выход из функции Main ().

  4. В особых ситуациях (например, обновление приложения) мне нужно запросить остановку приложения, поэтому мне нужно бесконечно зацикливаться и проверять некоторые условия выхода.Например, именно поэтому Console.ReadLine() мне не нужен.Нет проверки состояния выхода.

  5. Что касается вышеизложенного, я все еще хочу, чтобы функция Main () была максимально дружественной к ресурсам.Давайте выделим отпечаток функции, которая проверяет условие выхода.

Ответы [ 11 ]

0 голосов
/ 13 сентября 2011

Чтобы консольные приложения работали, просто добавьте Console.ReadLine() в конец кода в Main().

Если пользователь не сможет завершить приложение, вы можете сделать это с помощью цикла, подобного следующему:

while (true){
   Console.ReadLine();
}
...