一、需求
创建一个定时任务,定时执行数据处理任务,并记录日志,发送邮件。本篇使用的方法:windows service
定时任务常用的实现方法可参考大佬文章:Windows 自动定时执行任务的几种实现方法
二、实现
1、打开VS新建一个windows Service程序,我命名为TimerService
注意:.NET Framwork框架的选择要与你电脑上的框架一致,我这里选择的是4.7.2
2、在Service1设计器中右击空白处选择查看代码
3.在Service1.cs中设定
Onstart方法定义定时器的开始执行,执行的时间间隔,以及时间间隔达到后所要执行的方法。
执行了一个文件写入任务,代码如下:
using System; using System.IO; using System.Net.Mail; using System.ServiceProcess; using System.Timers; using Outlook = Microsoft.Office.Interop.Outlook; namespace TimerService { public partial class Service1 : ServiceBase { private Timer timer; public Service1() { InitializeComponent(); } /// <summary> /// Start Service /// </summary> /// <param name="args"></param> protected override void OnStart(string[] args) { timer = new Timer(60 * 1000); timer.Elapsed += new ElapsedEventHandler(Timer_Elapsed); timer.Start(); WriteLog("Service Start." + " " + DateTime.Now.ToString()); } /// <summary> /// Stop Service /// </summary> protected override void OnStop() { WriteLog("Service Stop." + " " + DateTime.Now.ToString()); timer.Stop(); timer.Dispose(); } /// <summary> /// Execute Service /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Timer_Elapsed(object sender, ElapsedEventArgs e) { WriteLog("Service Execute……" + " " + DateTime.Now.ToString()); var res = Send(); WriteLog(res); } /// <summary> /// Write Log /// </summary> /// <param name="str"></param> protected void WriteLog(string str) { string filePath = AppDomain.CurrentDomain.BaseDirectory + "Log.txt"; StreamWriter sw = null; if (!File.Exists(filePath)) { sw = File.CreateText(filePath); } else { sw = File.AppendText(filePath); } sw.Write(str + Environment.NewLine); sw.Close(); } /// <summary> /// /// </summary> /// <param name="body"></param> public string Send() { try { SmtpClient client = new SmtpClient("smtp.wdc.com", 25); client.UseDefaultCredentials = true; MailAddress from = new MailAddress("[email protected]"); MailAddress to = new MailAddress("[email protected]"); MailAddress cc = new MailAddress("[email protected]"); MailMessage message = new MailMessage(); message.From = from; message.To.Add(to); message.CC.Add(cc); //message.Attachments.Add(new Attachment("test.txt")); message.Body = "大家好,blablablabla邮件正文"; message.BodyEncoding = System.Text.Encoding.UTF8; message.Subject = "邮件标题"; message.SubjectEncoding = System.Text.Encoding.UTF8; client.Send(message); message.Dispose(); message = null; client.Dispose(); client = null; return "发送正常"; } catch (Exception e) { return "异常:" + e.Message; } } } }
4、在Service1设计器中右击空白处,选择添加安装程序,会添加一个ProjectInstaller设计器
5、在ProjectInstaller设计器中选择serviceProcessInstaller,右击查看属性,将Account的值改为LocalSystem
6、在ProjectInstaller设计器中选择serviceInstaller1,右击查看属性,ServiceName就是服务中显示的名称,将其命名TimerService
7、右击解决方案,点击生成解决方案
三、安装
1、打开刚刚新建项目所在的文件夹,找到bin文件下面的debug文件夹,比如:C:\Users\Administrator\Source\Repos\TimerService\bin\debug,里面有个TimerService.exe应用程序,就是我们所要执行的项目
2、打开文件夹C:\Windows\Microsoft.NET\Framework\v4.0.30319,可以看到里面有一个InstallUtil.exe的应用程序,这就是我们要的安装工具,这里的Framework的版本与我们项目的Framework版本保持一致
3、打开cmd输入cd C:\Users\Administrator\Source\Repos\TimerService\bin\Debug指令,
然后再输入C:\Windows\Microsoft.NET\Framework64\v4.0.30319\installutil.exe /i TimerService.exe,即可完成安装。
PS:需要注意,cmd需要以管理员身份运行,否则可能出现安装失败的情况(提示权限不足,如下图2)
安装失败提示:
4、启动任务管理器,点击服务,找到名称TemrService的服务,右击启动,即可将创建的定时服务启动,这里的服务名称就是我们在项目的serviceInstaller1的属性里面设置的serviceName
5、在我们的C:\Users\Administrator\Source\Repos\TimerService\bin\Debug文件下面会发现多了一个log.txt的文件,就是我们在项目中创建的日志文件,打开即可看到项目正常执行。
四、卸载
卸载服务需要在cmd中输入以下指令即可
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\installutil.exe /u TimerService.exe
参考原文链接:https://blog.csdn.net/qingyou2006/article/details/126464305