同事离职后留一下程序,其中有一个Windows服务,让我产生来了想了解怎么写Windows服务的想法,百度后找到这篇文章,记录如下:
一、创建windows服务
如图新建一个Windows服务
空白服务如下
public partial class Service1 : ServiceBase { System.Threading.Timer recordTimer; public Service1() { InitializeComponent(); } //开始 protected override void OnStart(string[] args) { IntialSaveRecord(); } //停止 protected override void OnStop() { DbTools.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>服务停止"); } //继续 protected override void OnContinue() { DbTools.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>服务继续"); base.OnContinue(); } //暂停 protected override void OnPause() { DbTools.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>服务暂停"); base.OnPause(); } private void IntialSaveRecord() { TimerCallback timerCallback = new TimerCallback(CallbackTask); AutoResetEvent autoEvent = new AutoResetEvent(false); recordTimer = new System.Threading.Timer(timerCallback, autoEvent, 10000, 60000 * 10); } private void CallbackTask(Object stateInfo) { FileOpetation.SaveRecord(string.Format(@"当前记录时间:{0},状况:程序运行正常!", DateTime.Now)); } }
只要在OnStart里完成你的功能代码即可。本例中我们做一个定时向本地文件写记录的功能。
如图
创建一个类,用户写文件,
public class FileOpetation { /// <summary> /// 保存至本地文件 /// </summary> /// <param name="ETMID"></param> /// <param name="content"></param> public static void SaveRecord(string content) { if (string.IsNullOrEmpty(content)) { return; } FileStream fileStream = null; StreamWriter streamWriter = null; try { string path = Path.Combine(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase, string.Format("{0:yyyyMMdd}", DateTime.Now)); using (fileStream = new FileStream(path, FileMode.Append, FileAccess.Write)) { using (streamWriter = new StreamWriter(fileStream)) { streamWriter.Write(content); if (streamWriter != null) { streamWriter.Close(); } } if (fileStream != null) { fileStream.Close(); } } } catch { } } }
那么在Service1中调用,
public partial class Service1 : ServiceBase { System.Threading.Timer recordTimer; public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { IntialSaveRecord(); } protected override void OnStop() { if (recordTimer != null) { recordTimer.Dispose(); } } private void IntialSaveRecord() { TimerCallback timerCallback = new TimerCallback(CallbackTask); AutoResetEvent autoEvent = new AutoResetEvent(false); recordTimer = new System.Threading.Timer(timerCallback, autoEvent, 10000, 60000 * 10); } private void CallbackTask(Object stateInfo) { FileOpetation.SaveRecord(string.Format(@"当前记录时间:{0},状况:程序运行正常!", DateTime.Now)); } }
这样服务算是写的差不多了,下面添加一个安装类,用于安装。
如图,在service1上右键-添加安装程序,
如图,添加一个安装程序,
如图,添加完成后,
设置相应的属性,给serviceInstaller1设置属性,主要是描述信息。如图,
给serviceProcessInstaller1设置,主要是account。一般选localsystem,如图,
这样服务已经写好了。那么如何添加到windows服务里面去呢。除了之前说过的用CMD,InstallUtil.exe和服务的exe文件进行手动添加。这些可以用代码来实现的。当然主要过程都是一样的。代码实现也是使用dos命令来完成的。
二、代码安装Windows服务
上面写好的服务,最终生成的是一个exe文件。 安装程序安装时需要用到这个exe的路径,所以方便起见,将这个生成的exe文件拷贝至安装程序的运行目录下。
这样,一个windows服务安装成功了。