c# 守护进程,WPF程序自守护

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

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

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

话不多说,直接上代码:

    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        /// <summary>
        /// 主进程互斥量
        /// </summary>
        private static System.Threading.Mutex mutex_main;

        /// <summary>
        /// 守护进程互斥量
        /// </summary>
        private static System.Threading.Mutex mutex_deamon;

        /// <summary>
        /// 是否为主进程
        /// </summary>
        private static bool isMain = false;

        /// <summary>
        /// 打开监视定时器
        /// </summary>
        public void RunMonitorTimer()
        {
            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Elapsed += timer_Elapsed;
            timer.Interval = 2000;
            timer.Start();
        }

        /// <summary>
        /// 打开程序
        /// </summary>
        /// <param name="arg">参数不为null时打开主进程,否则打开守护进程</param>
        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窗体用于展示守护进程状态,也可使用其他方式,有更好方式欢迎留言。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF程序自动更新是指在WPF应用程序运行过程中,可以自动检测和下载最新的程序版本,并完成程序的升级更新。实现WPF程序自动更新有很多方式,一种常见的方式是使用ClickOnce部署技术。 ClickOnce是微软提供的一种应用程序部署技术,它能够实现WPF程序的自动更新。具体实现步骤如下: 1. 在Visual Studio中,将WPF项目配置为发布状态。点击项目解决方案资源管理器中的项目名称,选择“属性”菜单,进入属性窗口。在窗口中选择“发布”选项卡,进行配置。 2. 在“发布”选项卡中,进行目标位置的配置,设置应用程序安装地址、发布文件夹路径等信息。 3. 在“发布”选项卡的“更新”部分,选择“发现更新方式”。可以选择自动发现更新或手动发现更新。 4. 配置完成后,点击“发布”按钮,将发布文件发布到指定位置。 5. 在应用程序启动时,调用ClickOnce提供的API,检查是否有可用的更新包。如果有更新包,就提示用户下载并安装新版本。 通过以上步骤,就可以实现WPF程序的自动更新了。当用户打开应用程序时,应用程序会自动检测是否有新的发布版本,如果有,就会弹出对话框提示用户进行更新。用户点击更新按钮后,应用程序会自动下载并安装新版本。 WPF程序自动更新能够保证用户使用的总是最新的程序版本,提升了用户体验,同时也方便开发者进行 bug 修复和功能更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值