在Windows服务中处理作业

时间:2018-10-07 10:27:30

标签: c# windows-services hangfire

我已经使用HangFire在C#中创建了Windows服务,如下所示:

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();
        }
    }
}

我在Windows 10上使用VS 2017。 编译后,服务安装成功但未启动! 当我尝试手动启动时,它会给出著名的错误1053:服务未及时响应启动或控制请求

我在stackoverflow.com中找到了有关授予NT AUTHORITY \ SYSTEM权限的答案。它不能解决我的问题 请帮忙。谢谢。

1 个答案:

答案 0 :(得分:0)

调试使用以下模式:

1。将此方法添加到WindowsService1类中:

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

2。在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();
    }

大多数情况下,您的错误是由于此问题造成的。