Создание службы 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. Следующий фрагмент кода показывает все необходимое для запуска сервиса. <pre class="prettyprint linenums">static void Main(string[] args) { // создадим массив сервисов ServiceBase[] servicesToRun; // чтобы создать новый образец нового сервиса, // просто добавьте его к списку сервисов, // указанных в конструкторе массива ServiceBase servicesToRun = new ServiceBase[] { new SpadesAdminService() }; // запустим все созданные сервисы. // Вообще-то, это не запустит сервисы, но // зарегистрирует их в Service Control Manager ServiceBase.Run( servicesToRun ); } </pre>


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.Но все равно иногда это случается и приходится заходить на комп удаленно и стартовать вручную.
<pre class="prettyprint linenums"> 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 }); </pre>