В каком приложении приложения .NET я могу добавить функции, которые оно должно выполнять? - PullRequest
0 голосов
/ 26 января 2009

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

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

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

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

То, что я хочу знать, это ...

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

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

Ответы [ 5 ]

1 голос
/ 26 января 2009

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

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

0 голосов
/ 26 января 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();
    }
}
}
0 голосов
/ 26 января 2009

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

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

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

0 голосов
/ 26 января 2009

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

0 голосов
/ 26 января 2009

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

...