Обработка заданий в службе Windows - PullRequest
0 голосов
/ 07 октября 2018

Я создал службу Windows в C #, используя HangFire, выглядит следующим образом:

using System;
using System.Configuration;
using System.ServiceProcess;
using Hangfire;
using Hangfire.SqlServer;

namespace WindowsService1
{
    public partial class Service1 : ServiceBase
    {
        private BackgroundJobServer _server;

        public Service1()
        {
            InitializeComponent();

            GlobalConfiguration.Configuration.UseSqlServerStorage("connection_string");
        }

        protected override void OnStart(string[] args)
        {
            _server = new BackgroundJobServer();
        }

        protected override void OnStop()
        {
            _server.Dispose();
        }
    }
}

Я использую VS 2017 в Windows 10. После компиляции и службы установлен успешно, но не запущен!При попытке запуска вручную выдает известную ошибку 1053: Служба не ответила на запрос запуска или управления своевременно .

Я нашел ответ на stackoverflow.com относительнопредоставить разрешение NT AUTHORITY \ SYSTEM.Это не решает мою проблему Пожалуйста, помогите.Спасибо.

1 Ответ

0 голосов
/ 07 октября 2018

для Отладка используйте этот шаблон:

1.Добавьте этот метод в WindowsService1 class:

 public void OnDebug()
 {
    OnStart(null);
 }

2.In Program.cs измените файлчто-то вроде этого:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main()
    {
      #if DEBUG
        var Service = new WindowsService1();
        Service.OnDebug();
      #else
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new WindowsService1()
        };
        ServiceBase.Run(ServicesToRun);
      #endif
    }
}

Таким образом, вы можете запустить свой код в сеансе пользователя и проверить возможные проблемы (не связанные с пользователем проблемы) .

** Не кладите все свои коды на метод OnStart.Состояние службы меняется на Started всякий раз, когда OnStart заканчивается.

** Вместо этого используйте поток, чтобы вы работали:

    System.Threading.Thread MainThread { get; set; } = null;
    protected override void OnStart(string[] args)
    {
        MainThread = new System.Threading.Thread(new System.Threading.ThreadStart(new Action(()=>{
            // Put your codes here ... 
        })));
        MainThread.Start();
    }

    protected override void OnStop()
    {
        MainThread?.Abort();
    }

В большинстве случаев ваша ошибка возникает из-за этой проблемы.

...