【背景】

在最近的一个项目中,我负责客户端模块的工作。需求要求,在启动客户端时需要判断客户端是否已经启动(单例)。于是我决定使用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 = ;
Process[] pros = Process.GetProcesses();
foreach (Process p in pros)
{
if (p.ProcessName.Equals("xxxxx"))
          {
           ++i;
          }
          if (i > ) { break; }
       } if (i>)
{
       Common.MessageEx.Msg("客户端已经启动!");
       return;
      }

【Mutex为什么不能判断】

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

最新文章

  1. scikit-learn预处理实例之一:使用FunctionTransformer选择列
  2. Coremail邮件系统存储型XSS两个
  3. Android 自定义控件之app标题栏的封装
  4. oracle启动关闭命令
  5. Reads sequentially from multiple sources
  6. git-ssh 配置和使用
  7. Blend4精选案例图解教程(三):一键拖拽
  8. T-SQL中的APPLY用法(半翻译)
  9. Linux系统下安装Angular2开发环境(Ubuntu16.0和deepin)
  10. Linux 权限位详解
  11. MariaDB:删除数据库报错:error: 'Error dropping database (can't rmdir './shiro', errno: 39)'
  12. pl-svo代码解读
  13. SVN 多分支管理
  14. MySQL批量修改字符集
  15. windows7安装tensorflow-gpu开发环境
  16. Latex Error:‘acmart.cls’ not found 解决方案:
  17. 信号处理篇alarm ferror kill mkfifo pause pclose perror pipe popen sigaction sigaddset sigdelset sigemptyset signal sleep strerror
  18. Java 连接MS Access数据库
  19. LeetCode: Reverse Words in a String 解题报告
  20. 新型智能芯片nxp----嗯质朴

热门文章

  1. iOS应用数据存储的常用方式
  2. MySQL基础学习之开始
  3. 使用ECLIPSE+MINGW搭建C/C++开发环境
  4. 宅男福利--利用Python简单爬图
  5. UIWebView与JS的深度交互-b
  6. 在安装MySQL Workbentch的时候出现如下问题,已经解决。
  7. bool([x]) 将x转换为Boolean类型
  8. [转载]C#读写配置文件(XML文件)
  9. zoj 3716
  10. Java免费开源数据库、Java嵌入式数据库、Java内存数据库