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对应版本路径不对
一般错误内容:
或它的某一个依赖项。系统找不到指定的文件
其他代码和各方法什么意思都已经注释很清楚,有问题给我留言
浙公网安备 33010602011771号