• C# windows服务 傻瓜式教程


    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对应版本路径不对

    一般错误内容:

    或它的某一个依赖项。系统找不到指定的文件

    其他代码和各方法什么意思都已经注释很清楚,有问题给我留言

  • 相关阅读:
    HTML中一定会常用的标签和标签属性(这是网页构成的重要元素
    HTML(超文本语言)
    SQL SERVER中视图、事务
    important覆盖行内样式
    线性渐变
    「JavaScript面向对象编程指南」闭包
    移动端文章图片大小限制
    Vue中ajax返回的结果赋值
    「JavaScript面向对象编程指南」基础
    JS媒体查询
  • 原文地址:https://www.cnblogs.com/xbding/p/2939051.html
Copyright © 2020-2023  润新知