咨询区

  • C. Dragon 76

在 .NET 中是否有比较好的方法可以阻止一个 application 被同时开启了多个实例?如果没有好的办法,那么只能退其次,给每个 application 配一些操作规范。

回答区

  • ImJustPondering

我总结有两种解法。

  1. 使用 Meutx。

[STAThread]
static void Main()
{using(Mutex mutex = new Mutex(false, "Global\\" + appGuid)){if(!mutex.WaitOne(0, false)){MessageBox.Show("Instance already running");return;}Application.Run(new Form1());}
}private static string appGuid = "c0a76b5a-12ab-45c5-b9d9-d693faa6e7b9";

关于 Mutex 更多资料,可参考:http://odetocode.com/Blogs/scott/archive/2004/08/20/401.aspx

  1. 使用 Process

可以迭代进程列表,判断是否已经存在该进程名即可,参考如下代码:

using System.Diagnostics;
....
[STAThread]
static void Main()
{
...int procCount = 0;foreach (Process pp in Process.GetProcesses()){try{if (String.Compare(pp.MainModule.FileName, Application.ExecutablePath, true) == 0){procCount++;                        if(procCount > 1) {Application.Exit();return;}}}catch { }}Application.Run(new Form1());
}
  • Tono Nam

其实可以仿 linux 上生成进程文件的方式,所以要做的就是在程序启动后,在某一个文件中写入一个默认的 uniqueid 值,参考如下代码:

public static void PreventMultipleInstance(string applicationId){// Under Windows this is://      C:\Users\SomeUser\AppData\Local\Temp\ // Linux this is://      /tmp/var temporaryDirectory = Path.GetTempPath();// Application ID (Make sure this guid is different accross your different applications!var applicationGuid = applicationId + ".process-lock";// file that will serve as our lockvar fileFulePath = Path.Combine(temporaryDirectory, applicationGuid);try{// Prevents other processes from reading from or writing to this filevar _InstanceLock = new FileStream(fileFulePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);_InstanceLock.Lock(0, 0);MonoApp.Logger.LogToDisk(LogType.Notification, "04ZH-EQP0", "Aquired Lock", fileFulePath);// todo investigate why we need a reference to file stream. Without this GC releases the lock!System.Timers.Timer t = new System.Timers.Timer(){Interval = 500000,Enabled = true,};t.Elapsed += (a, b) =>{try{_InstanceLock.Lock(0, 0);}catch{MonoApp.Logger.Log(LogType.Error, "AOI7-QMCT", "Unable to lock file");}};t.Start();}catch{// Terminate application because another instance with this ID is runningEnvironment.Exit(102534); }}

点评区

这个需求本质上和防重复登录时一样的,大概三种吧:

  1. 机器内作用域:

Metux,Process 是一个好办法。

  1. 跨机器或局域网作用域:

生成 PID 文件是一个好办法。

  1. 局域网,广域网:

可用 redis,zookeeper 之类的全局锁机制。

如何阻止给 一个程序 开启多个实例 ?相关推荐

  1. C#.NET禁止一个程序启动多个实例

    在Program.cs中添加如下代码:           Boolean createdNew; //返回是否赋予了使用线程的互斥体初始所属权             System.Threadin ...

  2. 这个世界,总是被设计得刚刚好?人类或许只是被设定的一个程序

    我是一个精神鉴定医师,上面这段话是我毕业时导师对我的叮嘱,也一直是我的座右铭.但,每个人都有自己不足为外人道的小小阴暗面,我的阴暗面则是一种快感的寻求--其实只要是精神病,无论思维逻辑再怎么缜密,也会 ...

  3. 一个程序员wower的青春记录

    本文原创且首发于公众号:瞬息之间,经作者授权转载 原标题:<魔兽,召唤燃情岁月>,编辑有修改 " 正是这样的一些人,怀着这样的热爱,才可能创造出这样的游戏,让我在最适合玩游戏的岁 ...

  4. 关于黑客,距离一个程序员有多远?

    待到秋来九月八,我花开后百花杀 黑客的世界 红客联盟 扫描与嗅探 攻击(Exploit) 永恒之蓝事件 (External Blue ) 渗透测试工具Metasploit 取得控制权 取得Shell ...

  5. 【iOS系列】-程序开启后台运行

    [iOS系列]-程序开启后台运行 iOS程序是伪后台的运行,可是有时候我们需要让其在后台也要进行一些操作,我们可以让其伪装成音乐的APP,这样就可以让程序后台进行相关操作了,具体做法如下: 1:在Ap ...

  6. 又是一个程序员粗心的代码引起频繁FullGC的案例

    这是笨神JVMPocket群里一位名为"云何*住"的同学提出来的问题,问题现象是CPU飙高并且频繁FullGC. 重现问题 这位同学的业务代码比较复杂,为了简化业务场景,笔者将其代 ...

  7. 为什么一个程序申请的内存有限制_为什么要做自己的小程序商城,做一个要多久?...

    原创:轻栈 为什么要做自己的小程序商城? 已经习惯了用排名说话,这是最新小程序活跃度的日榜: 正值618,日活最多的小程序,还是拼多多和京东购物.看看周榜和上个月榜单,这两个平台就算不是全平台搞活动, ...

  8. 用一个程序生成另一个程序_还有另一个报告生成器?

    用一个程序生成另一个程序 如果您具有业务应用程序开发的经验,那么很可能会遇到要求该应用程序具有灵活的报告机制的需求. 我工作的公司主要专注于开发业务解决方案,而报告是必不可少的,实际上,它必须包含我们 ...

  9. 王垠:怎样尊重一个程序员?

    得知一位久违的同学来到了旧金山湾区,然而我见到他时,这人正处于一生中最痛苦的时期. >>>> 他告诉我,自己任职的公司在他加入之前和之后,判若两人.录取的时候公司对他说,我们对 ...

最新文章

  1. 3D显示Cell效果
  2. zoj 1438 - Asteroids!
  3. Java 解惑(Java Puzzler)
  4. 声光调制器实验研究_脉冲光抽运原子钟研究取得进展
  5. 【并查集】打击犯罪(ssl 2342)
  6. jsp 构建单页应用_如何使用服务器端Blazor构建单页应用程序
  7. 聚焦 | 数据湖分析如何面向对象存储OSS进行优化?
  8. 查oracle执行的sql,oracle查询正在执行的sql
  9. linux冒险岛服务端,冒险岛V118单机版一键端,开放全职业 带GM工具和命令
  10. sql语句实现动态添加查询条件
  11. 推荐1个易上手代码开源的好用的H5网页编辑工具
  12. Qt编写地图综合应用3-省市区域图
  13. 如何成为一个软件构架师
  14. padding的用途
  15. STL(lower_bound)运行时错误
  16. select的执行顺序
  17. 七个经典推理(据说没有人能全部答对)
  18. Excel中这个汇总神器:数据透视表到底能干什么?
  19. WLAN设备接入过程
  20. 常见的监控摄像机的取流格式

热门文章

  1. 关于网站地址解析到65.49.2.178的问题和解决方法
  2. [导入]【翻译】WF从入门到精通(第八章):调用外部方法及工作流
  3. python的开发环境有哪些系统_Win10下配置机器学习python开发环境
  4. python 垃圾回收详解
  5. Spring.net学习记录
  6. mooc- 基本程序设计方法week1,week2
  7. EntityFramework6.X 之 Fulent
  8. html标签缺省(自带)样式大全
  9. Oracle数据库案例整理-Oracle系统执行时故障-Shared Pool内存不足导致数据库响应缓慢...
  10. 解题报告 树形图计数