C#-Windows服务创建和运行
Windows服务创建和运行
适用场景:
ASP.Net通常是一个无状态的提供程序,不支持持续运行代码或者定时执行某段代码,所以我们需要构建自己的Windows服务来运行那些定时任务。
项目中需要定时处理数据时可以使用服务,比如短信发送,邮件提醒,和其他信息系统集合对接等定时任务
话不多说,简单介绍如何创建
1.新建服务
从 Visual Studio“文件”菜单中,选择“新建” > “项目”(或按 Ctrl+Shift+N),打开“新建项目”窗口
导航到并选择“Windows 服务 (.NET Framework)”项目模板。
2.更改服务名称:
右击“属性”,找到“ServiceName”属性,修改成“MyService”
3.添加安装程序
(1)右击“Service.cs[设计]”窗口,选择“添加安装程序”。
可以看见项目中自动多了“serviceProcessInstall1”,"serviceInstaller1"这两个文件。
(2) 设置组件serviceProcessInstaller1的主要属性,Accout:账户类型,LocalSystem本地系统服务;
4.添加项目需要的业务代码
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.ServiceProcess; 5 using System.Text; 6 using System.Threading.Tasks; 7 namespace WindowsService 8 { 9 static class Program 10 { 11 /// <summary> 12 /// 应用程序的主入口点。 13 /// </summary> 14 static void Main() 15 { 16 ServiceBase[] ServicesToRun; 17 ServicesToRun = new ServiceBase[] 18 { 19 new Service1() 20 }; 21 ServiceBase.Run(ServicesToRun); 22 } 23 } 24 }
打开“Program.cs”,可以看到服务启动后,首先执行Service1。
这里,我们已5秒钟一个轮询,写一条日志信息为例。
(1)首先添加文件夹“Utils”,添加类“Common.cs”,用于记录日志
1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 namespace WindowsService.Utils 8 { 9 public static class Common 10 { 11 public static void WriteLogs(string content) 12 { 13 string path = AppDomain.CurrentDomain.BaseDirectory; 14 string LogName = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace.Split('.')[0]; 15 string[] sArray = path.Split(new string[] { LogName }, StringSplitOptions.RemoveEmptyEntries); 16 string aa = sArray[0] + "\\" + LogName + "Log\\"; 17 path = aa; 18 if (!string.IsNullOrEmpty(path)) 19 { 20 if (!Directory.Exists(path)) 21 { 22 Directory.CreateDirectory(path); 23 } 24 path = path + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";// 25 if (!File.Exists(path)) 26 { 27 FileStream fs = File.Create(path); 28 fs.Close(); 29 } 30 if (File.Exists(path)) 31 { 32 StreamWriter sw = new StreamWriter(path, true, System.Text.Encoding.Default); 33 sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "----" + content + "\r\n"); 34 sw.Close(); 35 } 36 } 37 } 38 } 39 }
(2)创建业务代码类“HandleService.cs”
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using WindowsService.Utils; 7 namespace WindowsService 8 { 9 public class HandleService 10 { 11 public static void ActionRun(ref bool isRun) 12 { 13 try { 14 isRun = true; 15 //业务代码 16 Common.WriteLogs("这是一条日志"); 17 18 } 19 catch (Exception ex) 20 { 21 Common.WriteLogs(ex.Message); 22 } 23 finally 24 { 25 isRun = false; 26 } 27 } 28 } 29 }
(3)设置Service1的定时触发功能,
需要添加定时器Timer,定时执行上一步创建的“HandleService.cs”中的业务逻辑,完整代码如下
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Diagnostics; 6 using System.Linq; 7 using System.ServiceProcess; 8 using System.Text; 9 using System.Threading.Tasks; 10 using WindowsService.Utils; 11 namespace WindowsService 12 { 13 public partial class Service1 : ServiceBase 14 { 15 public Service1() 16 { 17 InitializeComponent(); 18 } 19 System.Timers.Timer _timer = new System.Timers.Timer(); 20 private bool isRun = false; 21 protected override void OnStart(string[] args) 22 { 23 try 24 { 25 int _interval = 5 * 1000; 26 _timer.Interval = _interval; 27 _timer.AutoReset = true; 28 _timer.Enabled = true; 29 _timer.Elapsed += new System.Timers.ElapsedEventHandler(ActionRun); 30 Common.WriteLogs("服务已启动"); 31 } 32 catch (Exception ex) 33 { 34 Common.WriteLogs(ex.Message); 35 } 36 } 37 private void ActionRun(object sender, System.Timers.ElapsedEventArgs e) 38 { 39 try 40 { 41 if (!isRun) 42 { 43 HandleService.ActionRun(ref isRun); 44 } 45 } 46 catch (Exception ex) 47 { 48 Common.WriteLogs("Error:" + ex.Message); 49 } 50 } 51 protected override void OnStop() 52 { 53 _timer.AutoReset = false; 54 _timer.Enabled = false; 55 _timer.Stop(); 56 Common.WriteLogs("服务已停止"); 57 } 58 } 59 } 60
生成项目文件,全部生成成功后,就要开始服务的安装和启动
5.服务的安装和启动
项目成功后,在bin文件夹下找到生成的exe文件和exe.config文件,前者是运行程序,后者是服务的配置信息,实际项目中可以通过更改config中的内容,修改服务的配置信息。
安装和卸载主要使用的是.NET提供的InstallUtil.exe这个文件 ,文件位于C盘对应的目录下 C:\Windows\Microsoft.NET\Framework64\v4.0.30319,拷贝至和exe同一个目录bin下。
新建bat文件,用于安装,启动,卸载,停止,重启服务
1 安装.bat: 2 sc create MyWinService binPath= "%~dp0WindowsService.exe" start= auto 3 net start MyWinService 4 pause 5
1 启动.bat 2 net start MyWinService 3 pause 4
1 停止.bat 2 net stop MyWinService 3 pause
1 卸载.bat 2 net stop MyWinService 3 sc delete MyWinService binPath= "%~dp0JDWindowsService.exe" start= auto 4 pause
1 重启.bat 2 net stop MyWinService 3 net start MyWinService 4 pause
6.运行安装文件和启动服务
双击“安装.bat”,弹出cmd窗口,如下图,表示安装成功:
双击“启动.bat”,如下图表示成功启动服务
7.查看业务代码的日志写入是否成功
找到项目文件同一个目录下的Log文件,找到日志,如下图所示:
可以看到日志文件每隔5秒会写入一条日志文件,至此整个服务运行成功。
本文源码下载:
提取码:a62m