博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# windows服务 傻瓜式教程
阅读量:4671 次
发布时间:2019-06-09

本文共 5695 字,大约阅读时间需要 18 分钟。

public partial class Service1 : ServiceBase    {        ///         /// 定义是否在正在后台执行,如果执行将路过        ///         private static bool IsGoon = true;        ///         /// 定期事件,定时执行        ///         protected System.Timers.Timer TimerReadTask = null;        ///         /// 构造函数        ///         public Service1()        {            InitializeComponent();            //定时器,定时执行            TimerReadTask = new System.Timers.Timer { Enabled = true, Interval = 5000 };            //5秒读一下任务            TimerReadTask.Elapsed += new System.Timers.ElapsedEventHandler(TimerReadTaskElapsed);        }        #region 定时操作线程        ///         /// 定时操作线程        ///         /// 系统变量        /// 系统变量        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 线程事件        ///         /// backgroundWorker的DoWork事件,线程事件你的所有业务在这里执行        ///         /// 系统变量        /// 系统变量        private void bg_Work_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)        {            //接受RunWorkerAsync 里的传过来的值            DataTable dtSendInformation = e.Argument as DataTable;            /***********************************************             * 你的所有业务在这里执行            ***********************************************/            //设置状态,在线程结束的时候可以根据这个值来判断运行成功还是失败            e.Result = "1";        }        #endregion        ///         /// bg_Work 的RunWorkerCompleted事件 线程结束是运行(只有bg_Work_DoWork 事件執行,這個方法才會執行        ///         /// 系统变量        /// 系统变量        private void bg_Work_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)        {            if (e.Result.ToString() == "1")            {                IsGoon = true;            }            else            {                ///失败了发邮件。你也可以不做这步                SendMail(e.Error.Message);            }        }        #region 发邮件        ///         /// 发邮件        ///            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 = "
非联网海关端-企业信息管理-短信发送时出错:"; strContent += "
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
"; strContent += strMessage; strContent += "
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓"; 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 /// /// 获取一个datable /// ///
private static DataTable GetSendInformation() { DataTable dtSendinformation = null; return dtSendinformation; } /// /// 启动服务 /// protected override void OnStart(string[] args) { //服务开始时启动定期执行事件 TimerReadTask.Start(); } /// /// 停止服务 /// 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对应版本路径不对

一般错误内容:

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

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

转载于:https://www.cnblogs.com/xbding/archive/2013/03/01/2939051.html

你可能感兴趣的文章
cookie之三天免登录代码
查看>>
1043 幸运号码 数位DP
查看>>
js18
查看>>
2018-2019-2 20175308实验一 《Java开发环境的熟悉》实验报告
查看>>
如何设置WIN7自动登录(去除登录密码)
查看>>
关于bash中if语法结构的广泛误解(转)
查看>>
10G整数文件中寻找中位数或者第K大数
查看>>
操作手机数据库的uri
查看>>
Python小应用1 - 抓取网页中的链接地址
查看>>
HTML表格和列表笔记&练习<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>关于表格的一些练...
查看>>
Hadoop HBase概念学习系列之hbase shell中执行java方法(高手必备)(二十五)
查看>>
数据类型
查看>>
SharePoint 2010中的内容类型集线器 - 内容类型发布与订阅
查看>>
如何解决在Windows Server 2008 R2 上安装证书服务重启后出现 CertificationAuthority 91错误事件...
查看>>
c# 获取键盘的输入
查看>>
mysql忘记密码
查看>>
小股神助A股股民畅享经济发展红利
查看>>
Python灰帽子pdf
查看>>
Node.js区块链开发pdf
查看>>
轻松学SQL Server数据库pdf
查看>>