
一山不容二虎
在上一篇文章《给服务配上一个守护者-守护进程》中,我们给windows添加了一个守护进程,并将守护进程设置为开机启动,实现开机自动守护服务的效果。
但是如果我们不小心,双击了两次守护程序,这时候,就会同时运行两个保护程序。甚至出现n多个实例同时运行:

4个保护程序。。。
这时候,就可能出现两虎相争的情况,从而导致一些未知的错误。
那么如何避免这种情况呢?当然就是限制程序,只能启动一个示例!
大致思路
如何限制只能启动一个实例:
启动时检测是否已经启动程序,如果已经启动程序,直接退出,不执行后续的代码即可。
算法很简单,那如何用C#来实现呢?
Mutex互斥量
Mutex互斥量,是Windows系统中,可以跨进程访问的一种资源。通常使用Mutex来管理不能共享的资源。比如只允许一个线程操作的文件。
此时我们可以把保护程序,视为一种不能共享的资源。所以我们就可以使用Mutex来实现只能启动一个程序的效果。
代码非常简单:

判断程序是否已经启动
当然,我们仅仅利用了Mutex可以跨进程访问的特性,就实现了检测程序是否已经启动。
上面的代码中,需要保证一点,就是【mutexName】不能重复。最好使用一个有特色的名字,或者使用Guid来作为名字,从而避免Mutex的名字重复。进而导致判断出错。
遍历所有进程
上面使用Mutex是一种方法,还有一种方法,就是遍历全部进程,与当前的进程进行比较,如果出现了相同的进程,则说明程序已经启动。
代码如下:

遍历全部进程
这个方法的速度相对慢一点,但是对于计算机来说,那也是毫秒级的事情,我们完全感知不到。
但是这个方法不会出现重名的问题!甚至可以监测路径是否相同。
所以这个方法也有一些适用的场景。
实际效果
我们修改【Main】函数的代码:

在Main函数中加入判断逻辑
然后编译程序,先双击运行一个实例。当我们再次双击运行的时候,就会弹出提示:

多次运行的提示
当然,我们点击确定之后,后面的保护服务的代码,是不会执行的。从而避免一些不必要的问题。
通过以上的方法,我们就实现了限制程序只能运行一个实例的效果。
下期预告
让控制台程序转换为服务运行
敬请期待。。。
下一篇文章《正在路上。。。》,欢迎检阅!