C#中如何实现应用程序的自检(防止一个应用多次启动)

  /// <summary>
  /// 检查是否有其他实例正在运行
  /// </summary>
  /// <returns>如果找到其他运行实例则返回该进程,否则返回null</returns>
  public static Process RunningInstance()
  {
      // 获取当前进程信息
      Process current = System.Diagnostics.Process.GetCurrentProcess();
      // 获取系统中所有正在运行的进程
      System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcesses();
      // 遍历所有进程,查找相同名称的进程
      foreach (System.Diagnostics.Process process in processes) //查找相同名称的进程
      {
          // 排除当前进程本身
          if (process.Id != current.Id) //忽略当前进程
          {
              // 检查进程名称是否与当前进程名称相同
              if (process.ProcessName == current.ProcessName)//判断进程名称是否和当前运行进程名称一样
              {
                  // 进一步验证:检查可执行文件路径是否相同(确保是同一个程序的不同实例)
                  if (Assembly.GetExecutingAssembly().Location.Replace(@"/", @"\") == current.MainModule.FileName)
                  {
                      // 找到其他运行实例,返回该进程对象
                      return process;
                  }
              }
          }
      }
      // 没有找到其他运行实例,返回null
      return null;
  }

  /// <summary>
  /// 处理应用程序未捕获的异常
  /// </summary>
  /// <param name="sender">事件源</param>
  /// <param name="e">异常事件参数</param>
  private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
  {
      // 定义异常信息字符串
      string str;
      // 获取未处理的异常对象
      var error = e.Exception;
      if (error != null)
      {
          // 如果有异常对象,格式化异常信息和堆栈信息
          str = string.Format("出现应用程序未处理的异常----->" + "Application UnhandledException:{0};\n\r堆栈信息:{1}", error.Message, error.StackTrace);
      }
      else
      {
          // 如果没有异常对象,仅记录事件信息
          str = string.Format("Application UnhandledError:{0}", e);
      }
      // 可选:写入系统错误日志(已注释)
      //SystemError.WriteAlarmLog(str);
      // 弹出消息框提示用户发生错误,并显示异常信息
      System.Windows.MessageBox.Show("发生错误,请查看程序日志!" + Environment.NewLine + str, "系统错误", MessageBoxButton.OK, MessageBoxImage.Error);
      // 标记异常已处理,防止程序崩溃
      e.Handled = true;
  }


关于System.Diagnostics.Process.GetCurrentProcess()的介绍如下
 

返回的 Process 对象包含哪些信息?

这个 Process 对象提供了许多属性和方法,可以获取当前进程的详细信息,例如:

  • Id(进程 ID,int 类型,唯一标识该进程)

  • ProcessName(进程名称,如 "MyApp"

  • MainModule(主模块信息,通常是可执行文件 .exe 的路径)

  • StartTime(进程启动时间)

  • Threads(该进程的所有线程集合)

  • Handle(进程的 Windows 句柄)

  • PriorityClass(进程优先级)

  • WorkingSet64(进程占用的物理内存大小,单位:字节)

其中DispatcherUnhandledExceptionEventArgs用于处理 应用程序级别未捕获的异常

DispatcherUnhandledExceptionEventArgs 的作用是:

  • 捕获 WPF 应用程序中未处理的异常(如 UI 线程抛出的异常)。

  • 决定是否终止应用程序(通过 e.Handled 属性)。

  • 记录错误信息或显示友好错误提示(避免程序直接崩溃)

在 protected override void OnStartup(StartupEventArgs e)方法中如下使用 

// 注册未处理异常事件
this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);

this.DispatcherUnhandledException 是什么?

  • 类型Application.DispatcherUnhandledException 事件(属于 System.Windows.Application 类)。

  • 触发时机:当 WPF 应用程序的 UI 线程(Dispatcher 线程)抛出未捕获的异常时触发。

  • 默认行为:如果不处理此事件,WPF 应用程序会崩溃并显示错误对话框。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就是有点傻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值