记录几个window服务常见的坑
Windows服务看起来很简单,但在实际使用过程中经常会有奇奇怪怪的问题,我不相信只有我一个人遇到这些错误。
1,删除服务删不掉
不管我们用什么方式删除服务,删除的只是标记,正在运行的服务并不会停下来。这会导致一些其他的问题。所以删除后一定要执行停止服务的命令或在服务面板停止服务,或者干脆在先停止服务再删除。
2,停止服务停不掉
停止服务时,有时候会出现停不调,关不了,删不掉的情况。这个时候可以在任务管理器里面找到这个进程然后杀死。
快速寻找进程的方法:右击任务管理器列表的表头,勾选命令行。然后就可以看见应用程序的目录了。根据命令行目录很容易找到。
3, 启动/停止服务很慢或者超时。
造成这个问题往往是你的代码有问题,服务的代码往往是一段阻塞或者轮询式的代码。
在onStart里面写阻塞的代码,虽然可以正常执行,但是阻塞会让服务控制中心认为启动超时。 正确的做法是在一个新的线程里面执行我们的阻塞代码。
//正确的方式,在一个线程里面启动我们的业务 protected override void OnStart(string[] args) { Thread thread = new Thread(() => { while (true) { //todo } }); ; thread.Start(); } //错误的方式,这里的阻塞会让service.msc不知道我们启动成功了没有 protected override void OnStart(string[] args) { while (true) { //todo } }
4,控制台程序可以作为服务吗?
不可以。服务必须实现一些功能接口,比如:安装,启动,暂停等等。
普通的非服务程序,虽然可以用sc 命令安装成功,但无法正确执行。
正确的做法还是创建window 服务程序。
几个常用命令
创建服务
sc create 服务名 binpath="exe文件路径" displayName=显示名称 start=auto
修改服务描述
sc description 服务名 "服务描述"
停止服务
sc stop 服务名
删除服务
sc delete 服务名