![0a8a2b82afee70310a3b19606210f71c.png](https://i-blog.csdnimg.cn/blog_migrate/c403b0ed41d2c820f7dcc9dd038ce3d6.jpeg)
拉出来遛遛
上期回顾
在上一篇文章《用C#写一个在后台偷偷运行的服务》中,我们用C#完成了一个基础的Windows服务的编写。
![79433db3479f7daf334a9bbd6de4bea3.png](https://i-blog.csdnimg.cn/blog_migrate/9a9f2facaa5685b3d26bef0699c55e1d.jpeg)
代码结构图
加入业务代码
现在我们来讲解如何在服务中运行我们的业务代码:
![d453914b1fa6055db098fe448a8a163d.png](https://i-blog.csdnimg.cn/blog_migrate/7b0e48b27787eb62762d97e72bedba45.jpeg)
查看代码(F7)
我们查看MyService1.cs的代码:
![d73cb660f243e58248559b8c1c519fec.png](https://i-blog.csdnimg.cn/blog_migrate/de242d0e8a67db7bc0546199bde2ecd7.jpeg)
OnStart
其中的OnStart函数,就是执行我们的代码的地方。在这里我们可以实现自己的业务逻辑,比如数据监测,网络通信,后台服务等等。因为OnStart函数,会在用户启动服务的时候执行。
今天我们写一个简单的示例:
![462274f173ed34b8e29a801fa9ffbc54.png](https://i-blog.csdnimg.cn/blog_migrate/73cfca5222a4640cd6b540a541a18ff1.jpeg)
模仿业务代码
我们模拟一个循环,里面通过Sleep来模仿实际的业务代码,同时我们输出一个带计数的日志,来监控服务的运行情况。
其中的Logger是我简单写的一个日志模块,Logger会在服务的exe所在目录,创建指定文件名的日志文件,调用Logger.Log函数,即可完成日志的输出。
![5195918c049f081694292c3398c6a708.png](https://i-blog.csdnimg.cn/blog_migrate/ad94a38d3ef9e6b36ebf86c3b399f555.jpeg)
简单的日志
运行服务
现在我们编译一下服务,运行看看效果:
![5245ef23e065278e7420ddd342ad4db3.png](https://i-blog.csdnimg.cn/blog_migrate/96b9d1650bf12930c6a0f9d04be6157e.jpeg)
启动服务
打开日志文件:
![a9302b8829dbc94b8141722a1d1e0c51.png](https://i-blog.csdnimg.cn/blog_migrate/adbc153084da63c31e0982bda0778d33.jpeg)
日志
运行结果如下:
![b7718d2b1a1ad600562f6500ff60b2ec.png](https://i-blog.csdnimg.cn/blog_migrate/2b6eda86631414d5546be0f55a4ae36f.jpeg)
日志结果
可以看到我们的服务以及正常运行了。日志正常输出。
服务停止业务代码
![b44e528f9114743a78d795b3b0750d10.png](https://i-blog.csdnimg.cn/blog_migrate/bc98b3c72e2b641f3279b21f88acd8c0.jpeg)
OnStop
我们看到,在MyService1.cs中,还有一个自动生成的函数OnStop。这个函数就是处理服务停止的时候的业务代码。
通常我们的服务停止的时候,需要释放服务中的资源,如:
- 关闭文件
- 刷入缓存
- 关闭数据库连接
- 关闭网络连接
- 。。。。。。
这些资源释放的操作,就是在OnStop函数中执行的。而且OnStop函数,会在用户停止服务的时候调用。
![f5ec3bf72b66ac322414e59eb448afc3.png](https://i-blog.csdnimg.cn/blog_migrate/4cca38863ab33aef8c7bf5cfc0381737.jpeg)
收尾
我们就简单的实现停止服务逻辑:
- 标记服务结束
- 等待线程退出
- 释放日志资源
然后我们停止服务,编译程序,再重新运行服务。这时服务和之前没有差别。
现在我们再次停止服务,然后对比两次服务结束之后的日志输出的差异:
![56992ac00ece32bc9207f1297fc560d2.png](https://i-blog.csdnimg.cn/blog_migrate/440fa82d67304c6b12ea74d001d025e7.jpeg)
停止服务
![20f437405a64ef300f4418ac63159568.png](https://i-blog.csdnimg.cn/blog_migrate/aca48239c91495fe5a367fad7363fb50.jpeg)
结果对比
我们不难看出,在我们的OnStop函数中,服务还写了最后一条日志。
如果我们不在OnStop中执行相关的收尾工作,那么我们将丢失最后一次服务执行的数据。如果数据非常重要,这将导致数据丢失,进而造成严重后果。
踩坑记录
外老师在这时遇到一个问题:服务安装失败!
![9cf04318c5b17030ed222819f1290285.png](https://i-blog.csdnimg.cn/blog_migrate/32b6bbc8a85fb7ee900e72249bed29c2.jpeg)
安装失败
最后发现需要以管理员运行VS 2019才能执行服务安装!因为安装服务,需要管理员权限。
![38c7b89fb212f21ac73b9189b14fc3ae.png](https://i-blog.csdnimg.cn/blog_migrate/f7abe02b20039ddfdfd359f23ece8e3c.jpeg)
以管理员运行
下期预告
如何调试服务?
服务如何支持暂停/恢复?
以及其他服务的高级开发秘籍!
敬请期待。。。
下一篇文章《一步一步地调试C#服务》,欢迎检阅!