zoukankan      html  css  js  c++  java
  • C# 中判断程序是否启动使用Mutex使用异常

    【背景】

      在最近的一个项目中,我负责客户端模块的工作。需求要求,在启动客户端时需要判断客户端是否已经启动(单例)。于是我决定使用Mutex来实现此功能,代码如下:

                bool initiallyOwned = true;
                bool isCreated;
                Mutex m = new Mutex(initiallyOwned, "xxxxx", out isCreated);
                if (!(initiallyOwned && isCreated))
                {
                    Common.MessageEx.Msg("客户端已经启动!");
                    return;
                }

    此功能在大多数情况下,能够很好的实现判断客户端是否已经启动。

    【新的需求】

      NND,有一天来了一个变态(BT)的需求,客户端主窗体弹出子窗体后,子窗体需要支持最小化,子窗体最小化的同时主窗体需要同时最小化,主窗体还原时子窗体还原(我真想说一句,你大爷的,操作系统也没有实现过这么BT的需求呀)。

    【Mutex异常】

      经过一番折腾,终于实现了BT的需求。偶然一次操作,当我在客户端弹出子窗体后,将系统最小化,然后我又去运行启动一个新的客户端。眼前一幕把我吓尿了————NND尽然能够正常启动。

    【解决】

      最后程序调试,我发现当客户端已经启动时,并且处于上述操作过程中,再次启动客户端,Mutex是能够创建的。所以我只能做如下处理来实现(单例):

        

           int i = 0;
                Process[] pros = Process.GetProcesses();
                foreach (Process p in pros)
                {
                    if (p.ProcessName.Equals("xxxxx"))
              {
              
    ++i;
              }
             
    if (i > 1) { break; }
           }

    if (i>1)
    {
           Common.MessageEx.Msg(
    "客户端已经启动!");
          
    return;
          }

    【Mutex为什么不能判断】

       至于Mutex为什么不能判断,暂时还没有想通,希望通过此博客与大家共同交流!!!

  • 相关阅读:
    迅为IMX6ULL开发板-Linux MISC驱动-编写实验程序
    迅为龙芯2K1000开发板快速体验
    迅为3399开发板Android系统-使用strace跟踪系统调用
    迅为imx6ull开发板使用c语言调用shell命令控制led灯
    迅为与龙芯强强联合匠心之作 iTOP-2K1000开发板正式发布
    迅为iTOP3399开发板QT系统PCIE 4G移植-测试程序
    迅为IMX8MM开发板Android编译环境搭建
    bzero和memset函数
    [linux 2021-10-14] linux中启动jar的shell脚本
    重写与重载的区别
  • 原文地址:https://www.cnblogs.com/ITCommunication/p/3925591.html
Copyright © 2011-2022 走看看