English French German Spain Italian Dutch Russian Portuguese Japanese Korean Arabic Chinese Simplified

7 мая 2013 г.

C# Создание Windows Service

C# Создание Windows Service
Для создания сервиса использовалась среда Visual Studio 2010.
1. Откройте студию и создайте новый проект
2. Для того чтобы службу можно было установить необходимо добавить в проект installer.
В Sulution Explorer дважды щелкните по классу "Service1.cs", в появившемся окне щелкните правой кнопкой мыши и выберите "Add Installer". Появится новый класс "ProjectInstaller.cs" с двумя компонентами: "serviceProcessInstaller" и "serviceInstaller".
Установите свойства этих компонентов как показано на рисунках:

serviceProcessInstaller

serviceInstaller 3. Откройте код файла "Service1.cs". Здесь мы видим два метода "OnStart" и "OnStop" которые срабатывают при запуске и остановке сервиса соответственно.
Допустим нам необходимо чтобы наш сервис каждую секунду записывал строку в файл.
Для этого создадим отдельный поток который будет запускаться при старте сервиса в методе "OnStart". В данном котором будем производить запись в файл:

private readonly Thread workerThread;
        public Service1()
        {
            InitializeComponent();

            workerThread = new Thread(DoWork);
            workerThread.SetApartmentState(ApartmentState.STA);
        }

В методе "DoWork" реализуем запись в файл:
  private static void DoWork()
        {
            while (true)
            {
                string fname = @"c:\temp\temp.txt";
                using (StreamWriter stream = new StreamWriter(fname, true))
                {
                   stream.WriteLine("Hello World!");
                }
                // do some work, then
                Thread.Sleep(1000);
            }
        }

Теперь при старте сервера будем запускать поток, а при остановке сервера - останавливать поток:
        protected override void OnStart(string[] args)
        {
            workerThread.Start();
        }

        protected override void OnStop()
        {
            workerThread.Abort();
        }
    }

Добавим также метод который будет записывать в лог нашего сервиса события запуска и остановки сервера:
           public void AddLog(string log)
        {
            try
            {
                if (!EventLog.SourceExists("MyExampleService"))
                {
                    EventLog.CreateEventSource("MyExampleService", "MyExampleService");
                }
                eventLog1.Source = "MyExampleService";
                eventLog1.WriteEntry(log);
            }
            catch { }
        }


И будем вызывать его при запуске и остановке сервера.
Полностью код будет выглядеть следующим образом
          
   public partial class Service1 : ServiceBase
    {
        private readonly Thread workerThread;

        public Service1()
        {
            InitializeComponent();

            workerThread = new Thread(DoWork);
            workerThread.SetApartmentState(ApartmentState.STA);
        }

        protected override void OnStart(string[] args)
        {
            
            AddLog("Service is started");
            string fname = @"c:\temp\temp.txt";
            using (StreamWriter stream = new StreamWriter(fname, true))
            {
                stream.WriteLine("Служба запущена!");
            }
            workerThread.Start();
        }

        protected override void OnStop()
        {
            AddLog("Service is stopped");
            string fname = @"c:\temp\temp.txt";
            using (StreamWriter stream = new StreamWriter(fname, true))
            {
                stream.WriteLine("Служба остановлена!");
            }
            workerThread.Abort();
        }

        public void AddLog(string log)
        {
            try
            {
                if (!EventLog.SourceExists("MyExampleService"))
                {
                    EventLog.CreateEventSource("MyExampleService", "MyExampleService");
                }
                eventLog1.Source = "MyExampleService";
                eventLog1.WriteEntry(log);
            }
            catch { }
        }


        private static void DoWork()
        {
            while (true)
            {
                string fname = @"c:\temp\temp.txt";
                using (StreamWriter stream = new StreamWriter(fname, true))
                {
                   stream.WriteLine("Hello World!");
                }
                // do some work, then
                Thread.Sleep(1000);
            }
        }
    
    }

После того как сервис создан, его необходимо установить. В этом нам поможет утилита "installutil.exe", которая распространяется вместе с фраемворком.
Создайте батник со следующим содержимым
    
C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe E:\MyProjects\test\WindowsService1\WindowsService1\bin\Debug\WindowsService1.exe 
pause

здесь запускается утилита "installutil.exe", которой в качестве указывается наш сервис
запустите созданный батник из командной строки
если установка сервиса прошла успешно вы увидите сообщения:
"The Commit phase completed successfully".
"The transacted install has completed"

Теперь можно запустить наш сервер и посмотреть результат его выполнения
Зайдите в "Панель управления -> Администрирование -> Службы". Найдите установленную вами службу и запустите её
Теперь можно открыть созданный файл и посмотреть результат работы нашей службы
Как видно служба прекрасно отрабатывает
Теперь остановите службу.
Также в логе службы мы можем просмотреть когда наша служба запускалась и останавливалась
Зайдите в "Панель управления -> Администрирование -> Просмотр событий -> Журнал приложений и служб".
Здесь мы можем увидеть когда наша служба запускалась и останавливалась

Комментариев нет:

Отправить комментарий