Где в приложении-службе .NET добавить функции, которые оно должно выполнять?

Я знаю, как «создать» служебное приложение.

Я знаю, что писать в функции main ().

Я знаю, как добавить в службу журнал событий (или другие компоненты).

Я знаю, как определить, что происходит, когда служба запускается, останавливается или возобновляется.

Я хочу знать следующее ...

Я хочу, чтобы моя служба Windows выполняла определенные функции (например, индексирование файлов).

Где мне добавить код для выполнения этой функции в приложении службы?


person user57175    schedule 26.01.2009    source источник
comment
Не могли бы вы уточнить, что вы подразумеваете под функцией индексатора?   -  person Andrew Hare    schedule 26.01.2009


Ответы (5)


Я предполагаю, что вам нужно что-то, что будет запускаться периодически, а не постоянно. Возможно, вы захотите установить таймер, который запускает метод по истечении срока действия. Таймер может сбросить себя автоматически, или ваш обратный вызов может сбросить таймер для его следующего истечения, когда он завершится. Вы должны инициализировать таймер в своем методе OnStart. Вы должны быть осторожны, чтобы останавливать таймер, когда служба приостановлена ​​или остановлена, и очищать вещи при завершении работы.

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

person tvanfosson    schedule 26.01.2009

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

person Community    schedule 26.01.2009

Я предполагаю, что под «функцией индексатора» вы имеете в виду написанную вами библиотечную функцию, которую вы хотите запустить с помощью службы Windows. Если это так, добавьте свой код в этот замещающий метод:

protected override void OnStart(String[] args)
{
    // your stuff here
}

Этот код сработает при запуске службы.

person Andrew Hare    schedule 26.01.2009
comment
Вот и все...? Просто добавьте мой блок кода в OnStart, не беспокоясь о том, сколько времени займет выполнение моего кода? - person user57175; 26.01.2009
comment
Да, он будет работать столько, сколько ему нужно. Помните, что это может быть настолько опасно, насколько удобно. - person Andrew Hare; 26.01.2009
comment
Метод OnStart никогда не должен выполнять никакой работы, кроме некоторой быстрой настройки, а затем асинхронного запуска реальной работы. Либо через таймер, новый поток, либо как рабочий элемент для пула потоков. Если метод OnStart не возвращает быстро, служба будет считаться находящейся в состоянии ошибки. - person Stephen Martin; 26.01.2009

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

person Cerebrus    schedule 26.01.2009

Простой пример сервиса повторяющихся действий, основанный на System.Timers.Timer:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Timers;

namespace SrvControl
{
public partial class Service1 : ServiceBase
{
    Timer mytimer;
    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        if (mytimer == null)
            mytimer = new Timer(5 * 1000.0);
        mytimer.Elapsed += new ElapsedEventHandler(mytimer_Elapsed);
        mytimer.Start();
    }

    void mytimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        //Do Anything, e.g. write to eventlog
    }

    protected override void OnStop()
    {
        mytimer.Stop();
    }
}
}
person gimel    schedule 26.01.2009
comment
Таймеры в сервисах плохие, нет голосов против, но я бы их не рекомендовал. stackoverflow.com/questions/ 397744 / - person StingyJack; 26.01.2009
comment
В недавней заметке в Q397744 говорится: с тех пор обе службы работают без проблем. Пожалуйста, отметьте его как закрытое, потому что оно больше не актуально. - person gimel; 26.01.2009