上期回顾
在上一篇文章《用C#写一个在后台偷偷运行的服务》中,我们用C#完成了一个基础的Windows服务的编写。
加入业务代码
现在我们来讲解如何在服务中运行我们的业务代码:
我们查看MyService1.cs的代码:
其中的OnStart函数,就是执行我们的代码的地方。在这里我们可以实现自己的业务逻辑,比如数据监测,网络通信,后台服务等等。因为OnStart函数,会在用户启动服务的时候执行。
今天我们写一个简单的示例:
我们模拟一个循环,里面通过Sleep来模仿实际的业务代码,同时我们输出一个带计数的日志,来监控服务的运行情况。
其中的Logger是我简单写的一个日志模块,Logger会在服务的exe所在目录,创建指定文件名的日志文件,调用Logger.Log函数,即可完成日志的输出。
运行服务
现在我们编译一下服务,运行看看效果:
打开日志文件:
运行结果如下:
可以看到我们的服务以及正常运行了。日志正常输出。
服务停止业务代码
我们看到,在MyService1.cs中,还有一个自动生成的函数OnStop。这个函数就是处理服务停止的时候的业务代码。
通常我们的服务停止的时候,需要释放服务中的资源,如:
- 关闭文件
- 刷入缓存
- 关闭数据库连接
- 关闭网络连接
- 。。。。。。
这些资源释放的操作,就是在OnStop函数中执行的。而且OnStop函数,会在用户停止服务的时候调用。
我们就简单的实现停止服务逻辑:
- 标记服务结束
- 等待线程退出
- 释放日志资源
然后我们停止服务,编译程序,再重新运行服务。这时服务和之前没有差别。
现在我们再次停止服务,然后对比两次服务结束之后的日志输出的差异:
我们不难看出,在我们的OnStop函数中,服务还写了最后一条日志。
如果我们不在OnStop中执行相关的收尾工作,那么我们将丢失最后一次服务执行的数据。如果数据非常重要,这将导致数据丢失,进而造成严重后果。
踩坑记录
外老师在这时遇到一个问题:服务安装失败!
最后发现需要以管理员运行VS 2019才能执行服务安装!因为安装服务,需要管理员权限。
下期预告
如何调试服务?
服务如何支持暂停/恢复?
以及其他服务的高级开发秘籍!
敬请期待。。。
下一篇文章《一步一步地调试C#服务》,欢迎检阅!