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

一般错误内容:

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

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

posted @ 2013-03-01 16:48  丁焕轩  阅读(634)  评论(0编辑  收藏  举报