C# Преобразование консольного приложения в службу
Я пытаюсь преобразовать консольное приложение в службу Windows. Я пытаюсь, чтобы метод onstart службы вызывал метод в моем классе, но я не могу заставить его работать. Я не уверен, что делаю это правильно. Где я могу разместить информацию о классе в сервисе
protected override void OnStart(string[] args)
{
EventLog.WriteEntry("my service started");
Debugger.Launch();
Program pgrm = new Program();
pgrm.Run();
}
Из комментария:
namespace MyService {
static class serviceProgram {
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main() {
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] {
new Service1()
};
ServiceBase.Run(ServicesToRun);
}
}
}
2 ответа
Документация MSDN по службам Windows действительно хороша и содержит все необходимое для начала работы.
Проблема в том, что у вас есть реализация OnStart, которая должна использоваться только для настройки службы, поэтому она готова к запуску, метод должен возвращаться быстро. Обычно вы выполняете основную часть кода в другом потоке или в таймере. Смотрите страницу OnStart для подтверждения.
Редактировать: не зная, что будет делать ваша служба Windows, сложно сказать вам, как ее реализовать, но, скажем, вы хотели запускать метод каждые 10 секунд во время работы службы:
public partial class Service1 : ServiceBase
{
private System.Timers.Timer _timer;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
#if DEBUG
System.Diagnostics.Debugger.Launch(); // This will automatically prompt to attach the debugger if you are in Debug configuration
#endif
_timer = new System.Timers.Timer(10 * 1000); //10 seconds
_timer.Elapsed += TimerOnElapsed;
_timer.Start();
}
private void TimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs)
{
// Call to run off to a database or do some processing
}
protected override void OnStop()
{
_timer.Stop();
_timer.Elapsed -= TimerOnElapsed;
}
}
Здесь OnStart
Метод возвращается сразу после установки таймера и TimerOnElapsed
будет запущен в рабочем потоке. Я также добавил вызов System.Diagnostics.Debugger.Launch();
что сделает отладку намного проще.
Если у вас есть другие требования, отредактируйте ваш вопрос или оставьте комментарий.
Сделайте себе наибольшую пользу и используйте верхнюю полку http://topshelf-project.com/ чтобы создать свой сервис. Нет ничего проще, что я видел. Их документация просто, и развертывание не может быть проще. c:/ путь к сервису /service.exe установить.