网站首页 > 技术文章 正文
上期回顾
在上一篇文章《用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以及时间测量
- 08-03MySQL数据库的预处理详解
- 08-03《阿常·MySQL 70讲》全套教学视频
- 08-03隐式等待、显示等待和强制等待
- 08-03零基础C#上位机框架项目实例(完结篇)
- 08-03一文搞懂构建Web内容的技术
- 08-03西门子WINCC中的VBScript(VBS)常用于自动化脚本开发
- 08-03力控和sql2000之间的数据转储
- 08-03组态王|通过日历控件选择时间段查询历史报警
- 1521℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 639℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 527℃MySQL service启动脚本浅析(r12笔记第59天)
- 492℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 492℃启用MySQL查询缓存(mysql8.0查询缓存)
- 479℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 461℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 459℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- htmlbackground-image (68)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)