博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# 守护进程,WPF程序自守护
阅读量:6828 次
发布时间:2019-06-26

本文共 3789 字,大约阅读时间需要 12 分钟。

原文:

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/lwwl12/article/details/79035246

如何防止wpf程序异常关闭,守护进程是暂时能想到的最好方式。最好是能够一次编码就把守护进程的事情做完。

思路:程序打开时,首先打开守护进程;由守护进程打开主程序;守护进程与主程序间互相守护,任何一个挂了都能自动重启。

实现:Mutex互斥量,守护进程和主程序分别使用不同的互斥量,既可以防止重复打开软件,又可以检测程序是否在运行。

话不多说,直接上代码:

///     /// App.xaml 的交互逻辑    ///     public partial class App : Application    {        ///         /// 主进程互斥量        ///         private static System.Threading.Mutex mutex_main;        ///         /// 守护进程互斥量        ///         private static System.Threading.Mutex mutex_deamon;        ///         /// 是否为主进程        ///         private static bool isMain = false;        ///         /// 打开监视定时器        ///         public void RunMonitorTimer()        {            System.Timers.Timer timer = new System.Timers.Timer();            timer.Elapsed += timer_Elapsed;            timer.Interval = 2000;            timer.Start();        }        ///         /// 打开程序        ///         /// 参数不为null时打开主进程,否则打开守护进程        public void RunProcess(string arg = null)        {            /* 运行程序,不带参数,打开守护进程 */            Process m_Process = new Process();            m_Process.StartInfo.FileName = Process.GetCurrentProcess().MainModule.FileName;            m_Process.StartInfo.Arguments = arg;            m_Process.Start();        }        protected override void OnStartup(StartupEventArgs e)        {            //根据参数判断开启主进程还是守护进程,守护进程不带参数,主进程带参数            if (e.Args.Length < 1)            {                Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;                //守护进程互斥量                mutex_deamon = new System.Threading.Mutex(true, "MUTEX_DEAMON");                if (mutex_deamon.WaitOne(0, false))                {                    RunMonitorTimer();                    // 显示一个自定义窗体,非主窗体,用于阻塞进程,窗体关闭后,守护进程将关闭                    WndDeamon wnd = new WndDeamon();                    wnd.ShowDialog();                    this.Shutdown();                }                else                {                    MessageBox.Show("程序已经在运行!", "提示");                    this.Shutdown();                }            }            else            {                isMain = true;                mutex_main = new System.Threading.Mutex(true, "MUTEX_MAIN");                if (mutex_main.WaitOne(0, false))                {                    RunMonitorTimer();                    base.OnStartup(e);                    Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;                }                else                {                    Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;                    MessageBox.Show("程序已经在运行!", "提示");                    this.Shutdown();                }            }        }        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)        {            if (!isMain)            {                if (mutex_main == null)                {                    mutex_main = new System.Threading.Mutex(true, "MUTEX_MAIN");                }                if (mutex_main.WaitOne(0, false))                {                    //必须释放mutex,否则将导致mutex被占用,主程序不能允许                    mutex_main.Dispose();                    mutex_main = null;                    RunProcess("main");                }            }            else            {                if (mutex_deamon == null)                {                    mutex_deamon = new System.Threading.Mutex(true, "MUTEX_DEAMON");                }                if (mutex_deamon.WaitOne(0, false))                {                    mutex_deamon.Dispose();                    mutex_deamon = null;                    RunProcess();                }            }        }    }

app.xaml中添加上述代码即可,只需定义WndDeamon.xaml窗体用于展示守护进程状态,也可使用其他方式,有更好方式欢迎留言。

你可能感兴趣的文章
Android ADB 常用命令
查看>>
Nagios/Cacti异常报警,设定总动清理内存
查看>>
HA(高可用)集群之AIS(corosync),高可用httpd+NFS
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
centos知识点巩固
查看>>
碎纸片中的我的大学
查看>>
StreamWriter写入文件
查看>>
MQ 2035
查看>>
CCR与DAG的区别
查看>>
交换安全
查看>>
freemarker@ # $使用方法的区别
查看>>
Synchronized——实现原理、底层优化
查看>>
快速搭建 Discuz 论坛
查看>>
pip升级常见故障解决心得
查看>>
C语言:指针的运用
查看>>
TortoiseSVN 源码相关网址
查看>>
C语言贪吃蛇代码
查看>>
共享打印机:已达到计算机的连接数最大值,无法再同此远程计算机连接
查看>>
dos2unix 和 unix2dos
查看>>