Создание службы Windows - служба не ответила своевременно

mraklbrw

Добрый день.Служба:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace WindowsServiceTest1
{
 public partial class Service1 : ServiceBase
 {
 public Service1()
 {
 InitializeComponent();
 this.CanStop = true;
 this.CanPauseAndContinue = true;
 this.AutoLog = false;
 this.CanHandlePowerEvent = true;
 this.CanShutdown = true;
 }

 protected override void OnStart(string[] args)
 {
 File.AppendAllText("D:\\555667777.txt", "start");
 }

 protected override void OnStop()
 {
 File.AppendAllText("D:\\555667777.txt", "stop");
 }

 protected override void OnPause()
 {
 File.AppendAllText("D:\\555667777.txt", "pause");
 }

 protected override void OnContinue()
 {
 File.AppendAllText("D:\\555667777.txt", "continue");
 }


 }
}
Инсталлятор:
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;
using System.Threading.Tasks;
using System.ServiceProcess;
using System.Configuration.Install;

namespace WindowsServiceTest1
{
 [RunInstaller(true)]
 public partial class Installer1 : System.Configuration.Install.Installer
 {
 ServiceInstaller serviceInstaller;
 ServiceProcessInstaller processInstaller;

 public Installer1()
 {
 InitializeComponent();

 serviceInstaller = new ServiceInstaller();
 processInstaller = new ServiceProcessInstaller();

 processInstaller.Account = ServiceAccount.LocalSystem;
 serviceInstaller.StartType = ServiceStartMode.Automatic;
 serviceInstaller.ServiceName = "TestService1";
 Installers.Add(processInstaller);
 Installers.Add(serviceInstaller);
 }


 }
}
Устанавливаю через installutil.exe. Устанавливается без проблем.При запуске службы (через Диспетчер задач->Службы) выдаёт: Служба не ответила на запрос своевременно, не запускается.
10 ответов

mraklbrw

mraklbrw,Найди в сети рабочую демку службы.Установи её средствами винды.


mraklbrw

mraklbrw,И что там должно запускаться? Где метод Main?


mraklbrw

Это служба. Вместо Main - OnStart.


mraklbrw

Это служба. Вместо Main - OnStart.
Вы уверены, что событие сработает само по себе?


mraklbrw

Теперь, когда сервис написан, нужно сделать некоторую рутинную работу, чтобы иметь именно сервис. Все что нам нужно сделать для этого – это создать совокупность объектов ServiceBase и просто вызвать метод Run базового класса ServiceBase. Добавьте следующий код к методу Main объекта Application. Следующий фрагмент кода показывает все необходимое для запуска сервиса.
static void Main(string[] args)
{
// создадим массив сервисов
ServiceBase[] servicesToRun;

// чтобы создать новый образец нового сервиса,
// просто добавьте его к списку сервисов, 
// указанных в конструкторе массива ServiceBase
servicesToRun = new ServiceBase[] { new SpadesAdminService() };

// запустим все созданные сервисы.
// Вообще-то, это не запустит сервисы, но
// зарегистрирует их в Service Control Manager
ServiceBase.Run( servicesToRun );
}


mraklbrw

Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

namespace WindowsServiceTest1
{
 static class Program
 {

 static void Main()
 {
 ServiceBase[] ServicesToRun;
 ServicesToRun = new ServiceBase[]
 {
 new Service1()
 };
 ServiceBase.Run(ServicesToRun);
 }


 }
}


mraklbrw

1. Давно использую topshelf2. нет кода самого сервиса, что запускать то?


mraklbrw

Arm79,У topshelf есть одна неприятность - сервис иногда не запускается автоматом при перезагрузке компа.


mraklbrw

Arm79,У topshelf есть одна неприятность - сервис иногда не запускается автоматом при перезагрузке компа.
Ни разу такого не было. Кроме того, в настройках сервиса можно установить несколько попыток запуска при ошибках.Ну и грамотное логирование помогает определить причину ошибки. Грешите на TopShelf - заведите bug в ихнем трекере


mraklbrw

Arm79,До логгирования не доходит, так как служба не стартует.Вроде нашли решение - отложенный старт, появившийся с .Net 4.Но все равно иногда это случается и приходится заходить на комп удаленно и стартовать вручную.
HostFactory.Run(host =>
 {
 host.Service<AlarmIpService>(s =>
 {
 s.ConstructUsing(CreateService);
 s.WhenStarted(CallStart);
 s.WhenStopped(CallStop);
 });
 host.RunAsLocalSystem(); // use the local system account to run as
 host.StartAutomatically();
 // Automatic (Delayed) -- only available on .NET 4.0 or later
 [color=red] host.StartAutomaticallyDelayed();[/color] //host.UseNlog();

 host.SetDescription("???????????????????????????????????"); // description seen in services control
 host.SetDisplayName("????????????"); // friendly name seen in control panell
 host.SetServiceName("?????????????"); // used with things like net stop and net start
 });