2010-10-08 2 views
1

может кто-нибудь дать мне знать, как запустить длительный процесс из службы Windows (на C#)? процесс может занять несколько часов. служба должна проверять базу данных для выполнения любых ожидающих заданий. каждая работа может занять некоторое время. если нет ожидающих заданий, тогда он должен спать на 2 минуты (настраивается), а затем запускаться снова. как я могу это сделать с помощью службы Windows? Заранее спасибо.Как запустить длительный процесс в службе windows?

ответ

1
  1. Создайте новый проект «Служба Windows».
  2. Переопределить метод OnStart для создания потока. Этот поток будет обрабатывать опрос и обработку.
  3. Переопределите метод OnStop для установки флага. Поток с шага 2 следит за этим флагом и завершает его соответственно.
  4. Откройте конструкционную поверхность класса обслуживания. В нижней части окна «Свойства» находится ссылка «Добавить установщик». Нажмите на нее.
  5. Установите устройство с помощью InstallUtil или поместите его в пакет установщика.

Я пишу услуги все время, поэтому не стесняйтесь спрашивать меня о последующих вопросах.

+0

На самом деле мне не нравится сервис, потому что он продолжает бить DB каждые две минуты, чтобы проверить, есть ли какая-либо работа для выполнения, и это потеря процессорного времени, когда их нет. вместо этого мне нравится управляемая событиями модель, с помощью которой процесс просыпается только тогда, когда выполняется незавершенное задание. Я думаю, что это возможно с MSMQ, но я не знаком с ним, нужно выяснить, как его использовать.Спасибо за ответ. этот процесс должен иметь возможность генерировать несколько потоков, чтобы сэкономить время при выполнении нескольких ожидающих заданий. есть также требование убить процесс, если он занимает больше времени, чем обычно. – RKP

+0

Забавно, что вы должны упомянуть MSMQ. На самом деле, SQL Server отправляет сообщения MSMQ, когда есть работа. Посредством службы следит за очередью. Однажды очень редко, когда я потеряю одно сообщение MSMQ, но это происходит только тогда, когда я отправляю десятки тысяч сообщений за несколько секунд. –

0

В этом нет специального трюка, за исключением того, что вы не можете использовать какие-либо GUI/Forms или пользовательский ввод. Служба Windows по определению не имеет ввода/вывода пользователя. Напишите ошибки в журнале событий, и все в порядке.

+0

Я не могу поставить бесконечный цикл в методе запуска для службы, иначе служба не запустится. поэтому я искал какой-то механизм для запуска кода обработки задания каждые несколько минут. Мне удалось сделать это, используя компонент Timer и установив его интервал, но затем мне пришлось остановить таймер от тикания, когда процесс запущен. Я достиг этого, отключив таймер перед запуском процесса и включив его после завершения процесса. Спасибо за ваш ответ. – RKP

+0

попробуйте следующее: System.Threading.Thread.Sleep (2 * 60 * 1000); – Jay

0

Гораздо проще использовать запланированные задачи Windows, чем разрабатывать собственное приложение, вы должны попробовать.

Если это не работает так, как вы ожидаете, как сказал Джей, нет никакого трюка, просто помните, что нет графического интерфейса.

+0

эта услуга должна просыпаться каждые две минуты, и моя ИТ-политика компании не позволяет запланированной задаче иметь время сна менее 10 минут. поэтому мне пришлось выбрать вариант службы Windows. это было бы намного проще с консольным приложением, легко отлаживаемым. спасибо за ответ – RKP

3

вы должны создать консоль приложения что-то вроде этого

static void Main(string[] args) 

    { 
     bool createdNew; 
     Mutex m = new Mutex(true, "YourBatchProcessor", out createdNew); 
     if (!createdNew) 
     { 
      Console.WriteLine("YourBatchProcesso is already running!"); 
      return; 
     } 
     //your code goes here 

    } 

и, как Gmoliv сказал создавать запланированные задачи, чем запускать каждые 2 минуты

или если вы хотите написать службы окна, то ваш код услуги, как

public class YourServrClass 
    { 

    private int numticks = 0; 
    private Timer _timer; 
    private bool _IsStarted; 
    private int Interval =2000; //ticks //2 sec. 
    #region Initializer 
    public YourServrClass() 
    { 
     InitializeComponent(); 
     _timer = new Timer(); 
     _timer.Interval = Interval; 
     _timer.Elapsed += new ElapsedEventHandler(this.Timer_Tick); 
    } 
    #endregion 

    #region Timer_Tick to process 

    private void Timer_Tick(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     numticks++; 
     if (_IsStarted) 
     { 
      _timer.Stop(); 

      //your code //ProcessYourData(); 
      _timer.Start(); 
     } 
    } 
    #endregion 
    protected override void OnStart(string[] args) 
    { 
      _IsStarted=true; 
    } 

    protected override void OnStop() 
    { 
      _IsStarted=false; 
    } 

} 
+0

спасибо за ответ. Я также решил использовать компонент Timer, но мой код немного отличается. Я запускаю таймер в методе «OnStart», останавливаю его в методе «OnStop» и в обработчике событий «Истекший». Я отключу таймер непосредственно перед запуском процесса и снова включите его после завершения процесса. он работает сейчас. – RKP

Смежные вопросы