Windows Service 服务搭配FluentScheduler实现定时任务调度

时间:2022-07-03 17:19:08

Windows Service 服务

创建Windows Service 项目

  1. 创建一个Windows Service项目,并将项目名称改为 TaskWindowService
  2. 在解决方案资源管理器内将Service1.cs改为TaskService.cs
  3. 在服务启动和结束时,记录日志
protected override void OnStart(string[] args)
{
LogHelper.Log("服务启动!");
} protected override void OnStop()
{
LogHelper.Log("服务停止!");
}
  1. 打开TaskService的设计界面,右键“添加安装程序”
  2. 此时软件会生成两个组件,分别为serviceInstaller1serviceProcessInstaller1
  3. 点击serviceInstaller1,在“属性”窗体将ServiceName改为TaskServiceDescription改为我的服务,StartType保持为Manual

    Windows Service 服务搭配FluentScheduler实现定时任务调度
  4. 点击serviceProcessInstaller1,在“属性”窗体将Account改为LocalSystem(服务属性系统级别)

    Windows Service 服务搭配FluentScheduler实现定时任务调度
  5. 鼠标右键点击项目TaskWindowService,在弹出的上下文菜单中选择“生成”按钮,到此WindowService项目搭建完毕

创建安装、启动、停止、卸载服务的Windows窗体

  1. 新建一个Windows Form项目,并命名为WindowsServiceClient
  2. 添加引用将TaskWindowService添加到WindowsServiceClient中,并将其设置为“启动项目”
  3. 创建安装、启动、停止、卸载 按钮并创建点击事件
string serviceFilePath = $"{Application.StartupPath}\\TaskWindowsService.exe";
string serviceName = "TaskService"; //事件:安装服务
private void button1_Click(object sender, EventArgs e)
{
if (this.IsServiceExisted(serviceName)) this.UninstallService(serviceName);
this.InstallService(serviceFilePath);
} //事件:启动服务
private void button2_Click(object sender, EventArgs e)
{
if (this.IsServiceExisted(serviceName)) this.ServiceStart(serviceName);
} //事件:停止服务
private void button4_Click(object sender, EventArgs e)
{
if (this.IsServiceExisted(serviceName)) this.ServiceStop(serviceName);
} //事件:卸载服务
private void button3_Click(object sender, EventArgs e)
{
if (this.IsServiceExisted(serviceName))
{
this.ServiceStop(serviceName);
this.UninstallService(serviceFilePath);
}
} //判断服务是否存在
private bool IsServiceExisted(string serviceName)
{
ServiceController[] services = ServiceController.GetServices();
foreach (ServiceController sc in services)
{
if (sc.ServiceName.ToLower() == serviceName.ToLower())
{
return true;
}
}
return false;
} //安装服务
private void InstallService(string serviceFilePath)
{
using (AssemblyInstaller installer = new AssemblyInstaller())
{
installer.UseNewContext = true;
installer.Path = serviceFilePath;
IDictionary savedState = new Hashtable();
installer.Install(savedState);
installer.Commit(savedState);
MessageBox.Show("服务安装成功!");
}
} //卸载服务
private void UninstallService(string serviceFilePath)
{
using (AssemblyInstaller installer = new AssemblyInstaller())
{
installer.UseNewContext = true;
installer.Path = serviceFilePath;
installer.Uninstall(null);
MessageBox.Show("服务卸载成功!");
}
} //启动服务
private void ServiceStart(string serviceName)
{
using (ServiceController control = new ServiceController(serviceName))
{
if (control.Status == ServiceControllerStatus.Stopped)
{
control.Start();
MessageBox.Show("服务启动成功!");
}
}
} //停止服务
private void ServiceStop(string serviceName)
{
using (ServiceController control = new ServiceController(serviceName))
{
if (control.Status == ServiceControllerStatus.Running)
{
control.Stop();
MessageBox.Show("服务停止成功!");
}
}
}

直接运行WindowsServiceClient项目,并点击“安装服务”会报错提示权限不足。

此时可以打开项目的Debug文件夹,找到WindowsServiceClient.exe文件,右键以管理员身份运行。

Windows Service 服务搭配FluentScheduler实现定时任务调度

使用WIN+R的方式打开运行窗体,并在窗体内输入services.msc后打开服务,可以找到刚刚安装的TaskService

若需要直接运行项目来打开窗体安装服务,则需要使用UAC中Administrator的权限。在WindowsServiceClient项目中添加“应用程序清单文件”。

打开该文件将asInvoker修改为requireAdministrator

<requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

重启项目后就可以直接在VS中安装服务了。

以上内容主要转载自 https://www.cnblogs.com/cncc/p/7170951.html 然后做了一些小改动。

FluentScheduler 定时任务

关于FluentScheduler详细的介绍可以看下github的说明文档,介绍了所有的调用方式 https://github.com/fluentscheduler/FluentScheduler

  1. TaskWindowsService项目中通过nuget添加FluentScheduler

    Windows Service 服务搭配FluentScheduler实现定时任务调度
  2. TaskService中,服务启动的地方注册定时任务
protected override void OnStart(string[] args)
{
LogHelper.Log("服务启动!"); //每10秒执行一次任务
var registry = new Registry();
registry.Schedule(() =>
{
LogHelper.Log("服务运行中,执行定时任务!");
}).ToRunEvery(10).Seconds();
JobManager.Initialize(registry);
}

重新生成项目->运行->安装服务->运行服务,打开日志文件可以看到定时重新的任务的输出记录。

Windows Service 服务搭配FluentScheduler实现定时任务调度

Windows Service 服务搭配FluentScheduler实现定时任务调度的更多相关文章

  1. quartz&period;net结合Topshelf实现windows service服务托管的作业调度框架

    topshelf可以很简单方便的实现windows service服务,详见我的一篇博客的介绍 http://www.cnblogs.com/xiaopotian/articles/5428361.h ...

  2. C&num; Windows Service服务的创建和调试

    前言 关于Windows服务创建和调试的文章在网络上的很多文章里面都有,直接拿过来贴在这里也不过仅仅是个记录,不会让人加深印象.所以本着能够更深刻了解服务项目的创建和调试过程及方法的目的,有了这篇记录 ...

  3. &period;Net Windows Service&lpar;服务&rpar; 调试安装及System&period;Timers&period;Timer 使用

    Windows Service(服务)  是运行在后台的进程 1.VS建立 Windows 服务(.NET Framework) 2.添加Timer 双击Service1.cs可以拖控件(System ...

  4. 震惊!Windows Service服务和定时任务框架quartz之间原来是这种关系……

    过场CG:   接到公司领导的文件指示,“小熊”需要在6月底去海外执行一个行动代号为[定时任务]的营救计划,这个计划关系到公司某个项目的生死(数据安全漏洞),作战部拟定两个作战方案: 方案一:使用务定 ...

  5. C&num;制作Windows service服务系列二&colon;演示一个定期执行的windows服务及调试(windows service)

    系列一: 制作一个可安装.可启动.可停止.可卸载的Windows service(downmoon原创) 系列二:演示一个定期执行的windows服务及调试(windows service)(down ...

  6. &lbrack;开发笔记&rsqb;-Windows Service服务相关注意事项

    注意一:报错:“本地计算机上的 *** 服务启动后停止.某些服务在未由其他服务或程序使用时将自动停止.” 该问题主要的原因是 Service服务程序中有错误. 遇到这个问题时,无论是重新安装服务,还是 ...

  7. war包部署在tomcat下,使用windows service服务方式启动tomcat服务器,在包含调用dll的模块,报dll找不到问题的解决办法

    问题描述: 开发了一个需要调用dll的java web程序,在idea开发环境下运行调试没问题,可以正常运行,在tomcat/bin下,运行批处理startup.bat,启动tomcat服务器,也可以 ...

  8. &lbrack;开发笔记&rsqb;-控制Windows Service服务运行

    用代码实现动态控制Service服务运行状态. 效果图: 代码: #region 启动服务 /// <summary> /// 启动服务 /// </summary> /// ...

  9. 添加exe为windows service服务

    [方法一] 一.介绍 srvany.exe是Microsoft Windows Resource Kits工具集的一个实用小工具,用于将EXE程序作为Windows服务运行.srvany是其注册程序的 ...

随机推荐

  1. ECharts学习(4)--仪表盘

    1. ECharts中的仪表盘,要使用这个图表时把series中的type属性修改成'gauge',然后在detail中设置仪表盘详情,用于显示数据.最常用的是formatter(格式化函数或者字符串 ...

  2. 分模块创建maven项目(二)

    1.新建Parent项目,MavenProject 2.新建子模块项目,MavenProject 右击项目名 --> NEW --> other 结果,在parent上运行会打出两个包,一 ...

  3. 《head first java 》读书笔记(四)

    Updated 2014/04/09 P518--P581 <数据结构> ArrayList不能排序:TreeSet以有序状态保持并可防止重复.HashMap可用成对的name/value ...

  4. dva &plus; antd &plus; mockjs 实现基础用户管理

    1.安装dva-cli npm install dva-cli -g 2.创建应用 dva new dvadashboard   [dvadashboard为项目名]       3.安装mockjs ...

  5. 提升现代web app中页面性能

    提升现代web app的中的页面性能 前言,本文翻译自https://docs.google.com/presentation/d/1hBIb0CshY9DlM1fkxSLXVSW3Srg3CxaxA ...

  6. ASP&period;NET知识点汇总

    一 ,html属性20181113常用的居中方法1 text-align2 float3 margin (margin-left matgin-right margin-bottom margin-t ...

  7. 用vue脚手架创建bootstrap-vue项目

    用vue脚手架创建bootstrap-vue项目 框架的地址:https://bootstrap-vue.js.org/docs/ 第一步 vue init webpack demo第二步 cd de ...

  8. python学习6---排序问题

    1.对列表排序 一维列表: sorted():可用于任何可迭代对象,如数组.列表.字典等. sort():list.sort()返回None,这是因为sort在函数内部修改了list的值,当再次访问l ...

  9. Google AdSense怎么在新窗口打开

    Google AdSense早在十年前就支持在新窗口打开了,为什么我的AdSense广告还在当前页面打开? 德顺查了一下,发现最早在2007年就有网站记载,谷歌AdSense开始试验新窗口打开功能. ...

  10. kettle性能优化

    普通开发电脑,如果没有网络查询步骤,kettle正常的速度应该在3000~20000条/秒.如果速度在2000条/秒一下,就可能需要调优. 性能优化的方式包括如下几种: 1.通过改变开始复制的数量(针 ...