如何阻止给 一个程序 开启多个实例 ?

咨询区

  • 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 之类的全局锁机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF中设置了WindowStyle=None后,窗口仍然有边框的解决方法

1. 设置了窗体的WindowStyle"None",窗口还是右边框,如下图: 2. 这是因为窗体默认是可以改变大小的,所以需要修改ResizeMode的值 ResizeMode"NoResize", 这样设置后,上图中的边框就没有了

两度破译“白宫密码”,让美国政府部门崩溃,却称自己是抱娃敲代码的普通妈妈

全世界只有3.14 % 的人关注了爆炸吧知识抱娃敲代码称成功是幸运而已今天我们来点正经的,来跟大家分享一位乘风破浪的姐姐--王小云教授。自踏入2020年以来,山东大学网络空间安全学院(研究院)院长,双聘院士、讲席教授王小…

github java开源项目经验_10月份Github上最热门的Java开源项目

10 月份 GitHub 上最热门的Java开源项目排行已经出炉啦,在本月的名单中,实战项目类居多,当然也有像JavaGuide这样学习指南类项目,下面就是本月上榜的10个开源项目:1、Java(Star 18468)https://g…

转载:保护模式1

实模式与保护模式 摘自ITWIKI,为我和还没搞明白真实模式保护模式的XDJM们 真实模式 Intel 8086和8088有14个16位缓存器。其中四个(AX, BX, CX, DX)是通用目的(尽管每个缓存器有额外的目的;举个例子:CX可以被用来当作lo…

浙江移动无线dns服务器地址,浙江移动4g的dns服务器地址

浙江移动4g的dns服务器地址 内容精选换一换当创建文件系统后,您需要使用云服务器来挂载该文件系统,以实现多个云服务器共享使用文件系统的目的。本章节以Windows 2012版本操作系统为例进行NFS文件系统挂载,其他版本请参考以下主要步骤根据实际…

Android之给gridview的单元格加上分割线

有时候需要给gridview加上分割线,没有现成的解决方案,这里写好一个可以直接用的自定义gridview,就叫做LineGridView吧。先上图,zaker客户端第三方分享的gridview样式: 可以看到靠边的格子都是半封闭的,要实…

Azure Machine Learning - 如何使用 GPT-4 Turbo with Vision

介绍如何在Azure中使用GPT-4 Turbo with Vision 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理…

系统命名与 SQL 命名之争 - 第 1 部分

创建数据库对象的命名规范 创建数据库对象时,开发人员可以选择一种命名方法,可以选择遵循传统 IBM i 行为的系统命名模式 (*SYS),也可以选择遵循SQL 标准规则的 SQL 命名规范 (*SQL)。 DB2 for i 与其他数据库管理系统 (DBMS) 之间的主要差别…

C++ const 关键字使用

2019独角兽企业重金招聘Python工程师标准>>> 为什么使用const?采用符号常量写出的代码更容易维护;指针常常是边读边移动,而不是边写边移动;许多函数参数是只读不写的。const最常见用途是作为数组的界和switch分情况标号…

论大象如何装进冰箱

全世界只有3.14 % 的人关注了爆炸吧知识在这美好的一天,想和大家讨论一个有趣的数学话题:怎么才能将一只大象装进冰箱呢?数学的方法把大象放到冰箱里的分析学方法1)先把大象微分,然后把它放到冰箱里,再在冰…

2020下半年新机最新消息_提前剧透 2020 年下半年五大新机

华为 Mate40系列 美帝一系列封杀骚操作,并没有影响到华为手机下一代的处理器——台积电代工的、采用了 5nm 进程的 Mate40 处理器——麒麟 1020。为了 3D 脸部识别,可能还是采用刘海屏。Mate40 Pro 的曲率更大,正面屏幕的视觉冲击更加震撼&am…

手把手教你学Dapr - 5. 状态管理

介绍使用状态管理,您的应用程序可以将数据作为键/值对存储在支持的状态存储中。您的应用程序可以使用 Dapr 的状态管理 API 使用状态存储组件来保存和读取键/值对,如下图所示。例如,通过使用 HTTP POST,您可以保存键/值对&#xf…

Android之drawlayout使用和总结

DrawLayout 今天发的Android之SlidingMenu博客之后,有人说out了,说用DrawLayout,我插,被叼了,然后我就到网上查drawLayout是什么?原来是侧滑菜单,好吧,赶快学习下,网上很多例子,都不怎么全面,然后找了找了呀,终于找到到了个成形的,然后自己改了下,不说了,先爆照 …

qtp服务器怎么获得日志信息,QTP自动化测试-打开运行报告

微信JSAPI支付最近在微信H5页面内集成微信JSAPI支付,遇到不少问题,现将集成步骤及遇到的问题记录如下: 1.官方下载SDK,下载地址:https://pay.weixin.qq.com/wiki/doc/api ...如何Windows分页控件中增加统计功能在我的博客里面,很多Winform程序里面都用到了分页处理,这样可以不管…

eclipse 汉化教程(语言包)

Eclipse 汉化图形教程此教程仅仅以links方式安装eclipse插件,且接下来主要以eclipse安装语言包为例,如果教程过程中哪里不对,请指出,谢谢。因使Eclipse版本太多,我这里就以eclipse3.5.2为例,讲讲如何将其汉…

4. MyBatis几个可以优化的地方

与其说是优化, 还不如说是让配置更简单.一: 连接数据库的配置单独放到一个属性文件中在 src 路径下新建一个 db.properties 属性文件, 并把数据库连接信息放入文件中, 然后在 conf.xml 文件中导入属性文件引用就可以了, 这样更好管理.1. 新建 db.properties 文件2. 写入属性信息…

免费使用的支付宝,到底是怎么一年赚1206亿的?

全世界只有3.14 % 的人关注了爆炸吧知识眨眼间,马云居然退休已经一年了,真可谓白驹过隙,恍惚而逝啊!不过,你以为马云退休了,就清风明月,万事不管了。太年轻!其实马云依旧掌控者蚂蚁集…

C#中使用opencv处理图像

OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android、ios等操作系统上,它轻量级而且高效---由一系列C函数和少量C类构成,同时提供了Python、Ruby、MATLAB等语言的接口…

php psr 编码规范_PHP之PSR-4规范:自动加载

1. 概述本 PSR 是关于由文件路径 自动载入 对应类的相关规范,本规范是可互操作的,可以作为任一自动载入规范的补充,其中包括 PSR-0,此外,本 PSR 还包括自动载入的类对应的文件存放路径规范。关于「能愿动词」的使用为了…

Android之日期时间选择器使用方法

// 设置日期 @Override public void onClick(View v) {new DatePickerDialog(activity,new DatePickerDialog.OnDateSetListener() {@Overridepublic void onDateSet(DatePicker view, int year,int monthOfYear, int dayOfMonth) {// 设置calendar.set(year, monthOfYear, day…