Windows服务 + Quartz.NET

时间:2022-01-16 17:33:56

服务基础

安装
管理员打开cmd

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
InstallUtil.exe Path_WinSvc.exe

或者 将 InstallUtil.exe 直接拷贝到生成目录,运行 InstallUtil WinSvcName.exe

基础

原生实现

  • ServiceBase
  • ServiceInstaller

问题梳理

在初始化安装时发生异常:System.BadImageFormatException:
未能加载文件或程序集“file:///F:\IT\C#\WinSvc\TestWinSvc\Release\WinSvcSqh.exe”或它的某一个依赖项。
试图加载格式不正确的程序。

解决:注意生成-目标平台(x64 or x86)以及应用程序-目标框架

在“安装”阶段发生异常:“System.Security.SecurityException:未找到源,但未能搜索某些或全部事件日志。
不可访问的日志: Security。”

解决:不通过cmd窗口,改用.bat文件,右键以管理员身份运行。

安装服务Install.bat如下,仅供参考:

%复制安装文件至当前目录%
copy C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe %~dp0
%切换到当前bat文件所在目录%
cd /d %~dp0
%执行安装命令%
installutil WinSvcSqh.exe
@pause;

最后,在 我的电脑-右键属性-服务 中即可看到新增的windows服务。

  • 启动服务:直接右键-Start,或者 管理员身份运行cmd执行 net start WinSvcSqh
  • 停止服务:右键-Stop,或者 管理员身份运行cmd执行 net stop WinSvcSqh

看下代码,基本windows服务如下

partial class WinSvcSqh : ServiceBase
{
public WinSvcSqh() {
InitializeComponent();
} protected override void OnStart(string[] args) {
// do something
} protected override void OnStop() {
// do something
}
}

主程序启动代码如下

/// 应用程序的主入口点。
public static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] {
new WinSvcSqh()
};
ServiceBase.Run(ServicesToRun);
}

基础教程参见: https://www.cnblogs.com/cncc/p/7170951.html

Castle

  • IOC框架
  • 定时任务、日志服务

具体参见:.Net IOC框架 | sqh

扩展

目标:TopShelf+Quartz.net实现基于window服务的定时任务调度

Topshelf

官网 | Topshelf,开源,跨平台的宿主服务框架(Windows服务开发框架),便捷创建 windows服务。

  • 允许使用控制台程序开发windows服务,方便调试
  • 支持多实例的部署
  • 集成log4net

结合 Quartz,实现任务调度服务。

Quartz .Net

官网 | Quartz,开源,企业级定时计划任务调度框架,支持 .NET Core。

初步学习:Quartz .net开源job调度框架,相关参见Github上的demo示例:JobScheduleDemoCode