有时我们需要只允许运行应用程序的一个实例,当进程启动时,如果发现应用程序的一个实例在运行,就自动停止运行我们通常通过Mutex互斥体在Main函数中实现,通常的写法是:

[STAThread]
static void Main()
{
bool createNew;
using (System.Threading.Mutex m = new System.Threading.Mutex(true, Application.ProductName, out createNew))
{
if (createNew)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
else
{
MessageBox.Show("Only one instance of this application is allowed!");
}
}
}

我们在寻找答案时,往往来去匆匆,根本不去理会Mutex的特性和注意事项经过简单的测试,OK,拿来就用此时我们忽略了一个重要的前提条件:Mutex的命名规则。以上的写法在单用户下运行没有问题;在多用户下,每个用户都能启动一个实例,也就不能保证单实例运行了

如果需要在终端机服务器上使用,并且只允许一个实例的话,请使用下面的写法:

[STAThread]
static void Main()
{
bool createNew;
try
{
using (System.Threading.Mutex m = new System.Threading.Mutex(true, "Global\\" + Application.ProductName, out createNew))
{
if (createNew)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
else
{
MessageBox.Show("Only one instance of this application is allowed!");
}
}
}
catch
{
MessageBox.Show("Only one instance of this application is allowed!");
}
}

以下是MSDN的说明:

在运行终端服务的服务器上,已命名的系统 mutex 可以具有两级可见性如果名称以前缀“Global\”开头,则 mutex 在所有终端服务器会话中均为可见。如果名称以前缀“Local\”开头,则 mutex 仅在创建它的终端服务器会话中可见。在这种情况下,服务器上各个其他终端服务器会话中都可以拥有一个名称相同的独立 mutex如果创建已命名 mutex 时不指定前缀,则它将采用前缀“Local\”。在终端服务器会话中,只是名称前缀不同的两个 mutex 是独立的 mutex,这两个 mutex 对于终端服务器会话中的所有进程均为可见即:前缀名称“Global\”和“Local\”说明 mutex名称相对于终端服务器会话(而并非相对于进程)的范围

转载于:https://www.cnblogs.com/lzxianren/archive/2013/06/16/3138507.html

只运行一个实例的写法相关推荐

  1. 只运行一个实例的方法

    在VC++ 中编程中,只运行一个实例的方法主要有两类: 1 遍历当前的所有窗口,查找相同的实例.为了便于查找,一般要事先设一个查找标志. 2 利用系统提供的互斥对象或信标,直接让系统抑制重复的实例. ...

  2. 转:让程序只运行一个实例的四种方法

    先留着以后有用. 让程序只运行一个实例的四种方法 综述:让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建前,有窗口的程序在窗口创建前,检查系统中是否已经设置了某些特定标志了,如果 ...

  3. 让Java程序只运行一个实例

    一个程序可以在内存里面存在多个运行实例,比如,你可以打开多个微软的Word程序.但是,有些时候我们需要控制程序运行的实例只有一个,也就是说,该程序同一时刻在内存里面运行的只有一个实例.这样当这个程序在 ...

  4. Qt应用程序只运行一个实例

    在实际应用中,我们经常需要让应用程序只有一个实例,再打开新的文档或者页面时,只是替换现在的窗口或者新打开一个标签,而不是重新启动一次应用程序.Qt中是否可以做到这样呢,答案是肯定的,因为Qt本身可以直 ...

  5. linux 只运行一个实例 互斥锁,Linux多线程4-1_互斥量

    //包含头文件 int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_init(pthread_mutex_t *r ...

  6. c#,Winform同一系统中只运行一个实例。

    代码 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; na ...

  7. C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码

    2019独角兽企业重金招聘Python工程师标准>>> 我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错.为了更便 ...

  8. C# WinForm 判断程序是否已经在运行,且只允许运行一个实例

    static class Program {   /// <summary>   /// 应用程序的主入口点.   /// </summary>   [STAThread]   ...

  9. C#程序只允许运行一个实例的解决方案

    最近在做winform的程序中,需要只能打开一个程序,如果已经存在,则激活该程序的窗口,并显示在最前端.在网上google了一哈,找到了很多的解决方案.这里我整理了3种方案,并经过了测试,现和朋友们分 ...

最新文章

  1. 【机器视觉】 default算子
  2. CozyRSS开发记录8-解析一份RSS
  3. 学习 SQL 语句 - Select(4): 排序
  4. project 模板_施工进度横道图不会做?18份计划模板收藏好,输入参数迅速成图...
  5. DataSet and DataStream
  6. python企业文档管理系统django
  7. 【02.06-02.13】长赢计划主理人“ETF拯救世界”微博精选
  8. 24 - 面向对象1
  9. 焊接机器人编程c语言,机器人现场编程与调试(cnc上下料,弧焊,喷涂,点焊等),就是这么全!...
  10. 教你手把手基于java实现兼职招聘系统、基于SSM+mysql的Web校园招聘网站
  11. C/C++:计算N的N次方的个位数(巧用快速幂与模运算性质)
  12. Windows 7或Vista Explorer的“上”键盘快捷键
  13. 前端-超链接,相对路径
  14. matplotlib动画演示:细胞自动机-探索生命起源
  15. Django-Web 小技巧--Render函数
  16. 熊猫python小课靠谱吗_疫情之后,企业复工,新的机遇在哪里?
  17. 触心创业路 - 记一家VR游戏创业团队的经历
  18. 证书遗失补办、换证流程,这几样资料1个都不能少
  19. Linux 命令(151)—— pwd 命令
  20. 安卓桌面软件_装bi小神器,让你的手机变成电脑桌面

热门文章

  1. cmake could not find openssl_使用CMake构建C++项目
  2. Java工作笔记-Spring boot中配置文件加密(Jasypt的使用)
  3. Spring Boot-使用JDBC连接并检索数据库(Mysql在Docker中)
  4. C++工作笔记-WM_KEYFIRST和WM_KEYDOWN的用法
  5. matlab排序 第二条件,科学网—【MATLAB技术贴】矩阵多条件排序 - 崔健的博文
  6. 嵌入式linux sd卡读写,嵌入式Linux之我行——S3C2440上MMC/SD卡驱动实例开发讲解(二)...
  7. 部署thinkphp5框架的php,三、部署ThinkPHP5框架
  8. python分类算法的应用_Python基于sklearn库的分类算法简单应用示例
  9. linux audio A2B
  10. ad域需要自建dns服务器吗,创建AD DS域服务(图文详解)