Продолжаю развивать тему мелких утилит, выполняющих по расписанию всякие действия. Хоть 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);
}
}
И заодно :
Кратко, что делает этот код:
Главное тут проверка Environment.UserInteractive. При старте приложения как сервиса всегда будет возвращаться false. Таким образом, если приложение запущено как обычное приложение, будет сразу создан хост. А если запущено как служба, сначала будет создан поток службы, а в нем уже хост. Поэтому в процессе разработки можно будет просто запускать службу на отладку как консольное приложение.
Да, и в свойствах проекта, в типе выходных данных, стоит указать что это консольное приложение, иначе его не будет видно.
И главный из них - это устойчивость. Если программа по каким-то причинам упадет, то заново запускать её придется руками (в том или ином смысле). Службу система перезапустит самостоятельно.
Я хочу сделать службу, которая будет хостить 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();
}
}
}
{
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. Таким образом, если приложение запущено как обычное приложение, будет сразу создан хост. А если запущено как служба, сначала будет создан поток службы, а в нем уже хост. Поэтому в процессе разработки можно будет просто запускать службу на отладку как консольное приложение.
Да, и в свойствах проекта, в типе выходных данных, стоит указать что это консольное приложение, иначе его не будет видно.
Комментариев нет:
Отправить комментарий