public partial class Service1 : ServiceBase { /// <summary> /// 定义是否在正在后台执行,如果执行将路过 /// </summary> private static bool IsGoon = true; /// <summary> /// 定期事件,定时执行 /// </summary> protected System.Timers.Timer TimerReadTask = null; /// <summary> /// 构造函数 /// </summary> public Service1() { InitializeComponent(); //定时器,定时执行 TimerReadTask = new System.Timers.Timer { Enabled = true, Interval = 5000 }; //5秒读一下任务 TimerReadTask.Elapsed += new System.Timers.ElapsedEventHandler(TimerReadTaskElapsed); } #region 定时操作线程 /// <summary> /// 定时操作线程 /// </summary> /// <param name="sender">系统变量</param> /// <param name="e">系统变量</param> void TimerReadTaskElapsed(object sender, System.Timers.ElapsedEventArgs e) { //如果还在执行,路过。 if (IsGoon) { if (bg_Work.IsBusy == false) { //这个是我业务用到,你可以不用直接RunWorkerAsync()就行 DataTable dtTask = GetSendInformation(); if (dtTask.Rows.Count > 0) { IsGoon = false; //这句执行完了将执行bg_Work_DoWork方法 dtTask参数 可以在bg_Work_DoWork变量里取到 bg_Work.RunWorkerAsync(dtTask); } } } } #endregion #region 线程事件 /// <summary> /// backgroundWorker的DoWork事件,线程事件你的所有业务在这里执行 /// </summary> /// <param name="sender">系统变量</param> /// <param name="e">系统变量</param> private void bg_Work_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { //接受RunWorkerAsync 里的传过来的值 DataTable dtSendInformation = e.Argument as DataTable; /*********************************************** * 你的所有业务在这里执行 ***********************************************/ //设置状态,在线程结束的时候可以根据这个值来判断运行成功还是失败 e.Result = "1"; } #endregion /// <summary> /// bg_Work 的RunWorkerCompleted事件 线程结束是运行(只有bg_Work_DoWork 事件執行,這個方法才會執行 /// </summary> /// <param name="sender">系统变量</param> /// <param name="e">系统变量</param> private void bg_Work_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Result.ToString() == "1") { IsGoon = true; } else { ///失败了发邮件。你也可以不做这步 SendMail(e.Error.Message); } } #region 发邮件 /// <summary> /// 发邮件 /// </summary> public static void SendMail(string strMessage) { string strSendMail = System.Configuration.ConfigurationSettings.AppSettings.Get("SendMail"); string strSendMailPwd = System.Configuration.ConfigurationSettings.AppSettings.Get("SendMailPwd"); string strToList = System.Configuration.ConfigurationSettings.AppSettings.Get("ToErrorList"); string strMailService = System.Configuration.ConfigurationSettings.AppSettings.Get("MailService"); string strTitle = "非联网系统" + DateTime.Now.ToLongDateString() + "异常邮件"; string strContent = "<br><font color = red ><B>非联网海关端-企业信息管理-短信发送时出错:</B></font >"; strContent += "<br>〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓<br><br>"; strContent += strMessage; strContent += "<br><br>〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓"; System.Net.Mail.SmtpClient client = new SmtpClient(strMailService); client.UseDefaultCredentials = false; client.Credentials = new System.Net.NetworkCredential(strSendMail, strSendMailPwd); client.DeliveryMethod = SmtpDeliveryMethod.Network; System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage(strSendMail, strToList, strTitle, strContent); message.BodyEncoding = System.Text.Encoding.UTF8; message.IsBodyHtml = true; client.Send(message); } #endregion /// <summary> /// 获取一个datable /// </summary> /// <returns></returns> private static DataTable GetSendInformation() { DataTable dtSendinformation = null; return dtSendinformation; } /// <summary> /// 启动服务 /// </summary> protected override void OnStart(string[] args) { //服务开始时启动定期执行事件 TimerReadTask.Start(); } /// <summary> /// 停止服务 /// </summary> protected override void OnStop() { if (bg_Work.IsBusy == false) { //服务开始时停止定期执行事件 TimerReadTask.Stop(); } else { throw new Exception("任务正在执行,不可以停止服务......"); } } }
1、先增加一个WINDOWS服务工程
2、增加一个backgroundWorker 执行多线程任务控件(为的是异步执行) 代码中的bg_Work 是我定义backgroundWorker控件的name
三,bg_Work两个事件 要与代码中两方法绑定好
bg_Work 的RunWorkerCompleted事件bg_Work_RunWorkerCompleted
bg_Work 的DoWork事件bg_Work_DoWork
四,安装程序类,用来直接安装当前的服务。
好了到这里这个服务功能 是完成 了,那么我们要把服务下面我们要安装服务。
一,增加安装程序
右击你的服务文件,出现如下图:选择“添加安装程序”
二,这个程序里会有两个组件
serviceProcessInstaller和serviceInstaller
serviceInstaller:如下图:
要注意的是:serviceName别弄错了,这个就是服务的名称,正常就是你服务的那个文件名(肯定就是那个文件对应的类名),一般自动生成后你别动就行。
serviceProcessInstaller如下图:
然后就是四个bat文件
1,安装文件:
内容:%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe SMSManangeService.exe
说明:最后的那个参数是项目生成的exe名称
2,启动服务
内容:net start SmsService
3,停止服务
内容:net stop SmsService
4,卸载服务
内容:%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u SMSManangeService.exe
其他说明:如果项目是Framework3.5以下(包含)
安装和卸载内容有变化:%SystemRoot%\Microsoft.NET\Framework\v2.0.50727
上面用v4.0.30319必须是Framework4.0(包含)以上这用这个
如果执行上面四个bat出错,就两种情况:
1,那么请右击:用管理员身份运行。
2,就是InstallUtil.exe对应版本路径不对
一般错误内容:
或它的某一个依赖项。系统找不到指定的文件
其他代码和各方法什么意思都已经注释很清楚,有问题给我留言