перепутывание в C # - PullRequest
       29

перепутывание в C #

2 голосов
/ 15 ноября 2011

Я собираюсь создать системный сервис на C #.

В разделе onstart я хотел бы выполнять цикл каждые 30 секунд и запрашивать базу данных mysql. Если числа больше 0, я обработаю некоторые факсы с помощью библиотеки faxcom.

Мой вопрос: будет ли цикл каждые 30 секунд исчерпывать программу / компьютер? Какую функцию / метод лучше всего использовать для цикла и сна? У вас есть пример кода для цикла и сна?

Ответы [ 4 ]

7 голосов
/ 15 ноября 2011

Использование Thread.Sleep() было бы плохим решением, потому что даже во время сна ваш поток активен.Вместо этого используйте класс Timer и обработайте его событие Elapsed.

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

using System.Timers; 

private timer = new Timer();

protected override void OnStart(string[] args)
{
 timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
 timer.Interval = 30000; // every 30 seconds
 timer.Enabled = true;
}

Private void OnElapsedTime(object source, ElapsedEventArgs e)
{
   // Execute your code here
}
5 голосов
/ 15 ноября 2011

Я бы не стал использовать циклические конструкции для такой вещи.

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

Что касается вопроса о том, «слишком ли это много», то ответ полностью зависит от объема выполняемой работы и создаваемой нагрузки.

1 голос
/ 15 ноября 2011

Нет, вы не будете использовать процессор, потому что спящие потоки не запланированы для выполнения, пока не истечет их время ожидания. Используйте Thread.Sleep , чтобы текущий поток спал в течение тайм-аута в миллисекундах. Что-то вроде:

while(!stop) // boolean variable to indicate when to stop the service.
{
    Thread.Sleep(30000);
    // do work
}

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

0 голосов
/ 15 ноября 2011

Я бы не стал использовать System.Timers.Timer в вашем случае исключительно потому, что вы пишете Windows Service.В то время как вы можете использовать его, у вас не будет доступного графического интерфейса, и поэтому вам не нужно ничего, что этот таймер мог бы предоставить, как если бы вы использовали графический интерфейс (по этой причине он наследуется от System.ComponentModel.Component),Это довольно просто в использовании.

...