Wpf实现一个最简单的守护进程

2021-10-25

守护进程是什么?

守护进程( daemon )是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束.守护进程_百度百科 (baidu.com)

英文名是 daemon ,不是 deamon 写了好久看了百科才知道...

他与我们的主程序通常不会出现交互的情况,而且守护进程是脱离于我们主程序执行的。可以理解为两个单独的程序,当主程序A出现问题意外闪退时,守护程序B不会因为主程序A出问题而导致程序B无法运行,简单来说就是A挂了,B还可以正常运行,B不受A影响。

通常守护进程的名字比主程序多一个d,如主程序名为main.exe,那么守护进程应该时maind.exe。可参考mysql、mysqld,mongo、mongod

守护进程常用来做什么?

1.重启、流氓软件关也关不掉

2.记录主程序崩溃闪退的日志

3.检查网络连接、位置信息

如何实现一个简单的守护进程?

以下内容大部分都参考于:c# 守护进程,WPF程序自守护David-CSDN博客wpf 守护进程 因为这个例子有一个无法处理的问题——守护进程无法隐藏。所以我拿过来改了一下。

image-20211025172832911

主程序 MainPro

替换 App.xaml.cs

利用 System.Timers.Timer 定时器来循环检测守护程序B是否存在——Mutex.WaitOne(0, false)

若不存在则启动守护程序B。

替换 MainWindow.xaml
MainWindow.xaml.cs 添加

方法 Button_Click 主要是测试主程序A异常时,守护进程B是否可以记录异常信息并重启主程序A。

主程序A异常闪退

方法 Window_Closing 主要是为了关掉主程序A,因为守护线程会持续检测主程序A是否存在,若不存在则启动主程序A,这时我们关掉主程序A,守护进程检测不存在就又会帮我们把程序开起来,就会造成主程序A "关不掉" 的现象。要测试的话可以把这个函数的内容注释。

image-20211025175407654

关不掉

守护程序 MainProd

替换 App.xaml.cs

利用 System.Timers.Timer 定时器来循环检测主程序A是否存在——Mutex.WaitOne(0, false)

若不存在则搜索window错误日志,将有关程序A的错误日志记录并重启程序A,值得注意的是有可能会重复记录到相同的错误日志。

替换 MainWindow.xaml

上述那个例子 将窗体设置为隐藏 Visibility="Hidden" 无法启动程序,但现在却可以,不知道为什么。

MainWindow.xaml.cs 添加

添加 MainProd 引用

很重要的一步,MainPro 添加对 MainProd 的引用

image-20211025183018759

其他

完整代码:logerlink/DaemonDemo: .net core wpf 最简单的守护进程 (github.com)

剑神,二五仔最帅