网站首页 > 技术文章 正文
上期回顾
在上一篇文章《用C#写一个在后台偷偷运行的服务》中,我们用C#完成了一个基础的Windows服务的编写。
加入业务代码
现在我们来讲解如何在服务中运行我们的业务代码:
我们查看MyService1.cs的代码:
其中的OnStart函数,就是执行我们的代码的地方。在这里我们可以实现自己的业务逻辑,比如数据监测,网络通信,后台服务等等。因为OnStart函数,会在用户启动服务的时候执行。
今天我们写一个简单的示例:
我们模拟一个循环,里面通过Sleep来模仿实际的业务代码,同时我们输出一个带计数的日志,来监控服务的运行情况。
其中的Logger是我简单写的一个日志模块,Logger会在服务的exe所在目录,创建指定文件名的日志文件,调用Logger.Log函数,即可完成日志的输出。
运行服务
现在我们编译一下服务,运行看看效果:
打开日志文件:
运行结果如下:
可以看到我们的服务以及正常运行了。日志正常输出。
服务停止业务代码
我们看到,在MyService1.cs中,还有一个自动生成的函数OnStop。这个函数就是处理服务停止的时候的业务代码。
通常我们的服务停止的时候,需要释放服务中的资源,如:
- 关闭文件
- 刷入缓存
- 关闭数据库连接
- 关闭网络连接
- 。。。。。。
这些资源释放的操作,就是在OnStop函数中执行的。而且OnStop函数,会在用户停止服务的时候调用。
我们就简单的实现停止服务逻辑:
- 标记服务结束
- 等待线程退出
- 释放日志资源
然后我们停止服务,编译程序,再重新运行服务。这时服务和之前没有差别。
现在我们再次停止服务,然后对比两次服务结束之后的日志输出的差异:
我们不难看出,在我们的OnStop函数中,服务还写了最后一条日志。
如果我们不在OnStop中执行相关的收尾工作,那么我们将丢失最后一次服务执行的数据。如果数据非常重要,这将导致数据丢失,进而造成严重后果。
踩坑记录
外老师在这时遇到一个问题:服务安装失败!
最后发现需要以管理员运行VS 2019才能执行服务安装!因为安装服务,需要管理员权限。
下期预告
如何调试服务?
服务如何支持暂停/恢复?
以及其他服务的高级开发秘籍!
敬请期待。。。
下一篇文章《一步一步地调试C#服务》,欢迎检阅!
猜你喜欢
- 2024-09-11 C# (Winform)实现USB HID自定义接口操作(控制下位机,如STM32)
- 2024-09-11 Tcp服务端一直sleep,客户端不断发送数据产生的问题
- 2024-09-11 C#中的进程与线程及其并发编程(c#多线程并发处理)
- 2024-09-11 C#中AutoResetEvent和ManualResetEvent使用场景
- 2024-09-11 C# AutoResetEvent 和 ManualResetEvent 在 WinForms 应用中的使用
- 2024-09-11 C#基础 DateTime详解(c# datetime.date)
- 2024-09-11 C# 面向对象 静态类和静态成员(c# 静态方法和实例方法)
- 2024-09-11 C#编程中如何使用线程(c#线程是什么)
- 2024-09-11 一篇文章搞懂C#中的接口(c#中接口怎么使用)
- 2024-09-11 C#高精度Timer和Delay以及时间测量
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)