вторник, 29 мая 2012 г.

Служба Windows, часть 1

Продолжаю развивать тему мелких утилит, выполняющих по расписанию всякие действия. Хоть WinForms приложение и удобно в разработке, но есть у него минусы.

    И главный из них - это устойчивость. Если программа по каким-то причинам упадет, то заново запускать её придется руками (в том или ином смысле). Службу система перезапустит самостоятельно.
    Я хочу сделать службу, которая будет хостить WCF службу. Класс службы будет называться ManagerControlService.
    Итак, для начала новый создадим проект службы. Создать проект -> Visual C# -> Windows -> Служба Windows. В принципе, полученная служба уже работоспособна. Но вот отлаживать её... Поэтому пойдем немного иным путем. Модернизируем метод Main класса Program следующим образом:


static void Main()
        {
           
           
            if (Environment.UserInteractive)
            {
                manager = ManagerControlService.Service;
                manager.Start();
                Console.WriteLine("The service is ready.");
                Console.ReadLine();
            }
            else
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[]
                {
                    new Service1()
                };
                ServiceBase.Run(ServicesToRun);
            }
        }

И заодно :

public partial class Service1 : ServiceBase
    {
        private ManagerControlService manager;
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            manager = ManagerControlService.Service;
            manager.Start();
        }

        protected override void OnStop()
        {
            if(manager!=null)
            {
                manager.Stop();
            }
        }
    }

    Кратко, что делает этот код:
    Главное тут проверка Environment.UserInteractive. При старте приложения как сервиса всегда будет возвращаться false. Таким образом, если приложение запущено как обычное приложение, будет сразу создан хост. А если запущено как служба, сначала будет создан поток службы, а в нем уже хост. Поэтому в процессе разработки можно будет просто запускать службу на отладку как консольное приложение.
    Да, и в свойствах проекта, в типе выходных данных, стоит указать что это консольное приложение, иначе его не будет видно.

Похожие посты:

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

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