同一目录的程序,同时只能运行一个

同一目录的程序,同时只能运行一个,第1张

有时候需要只允许程序只能同时运行一个实例。实现方式有很多。

一. 进程互斥

原理:通过获取系统进程列表,如果发现有重名的,则表示程序已经运行了,此时新运行的进程就退出;

实现:System.Diagnostics.Process类的静态方法GetProcessesByName(string processName)

Process[] ps = Process.GetProcessesByName(Guo.exe)if(ps !=null&&ps.Length1){//发现重复进程}

写在Main方法里;判断Length大于1,是因为本身启动之后也在进程列表里了,第一次启动的时候Length==1;

优点:代码简单;

缺点:会把别的重名程序误认为是自己(如很多软件都有update.exe);可以通过复制多个exe并起不同名字来达到运行多个实例的目的;

二. 共享锁(文件、注册表)

原理:运行程序时,在一个公共的位置创建一个共享值(如在固定目录创建一个文件,或者在固定的注册表位置创建一个值),退出程序时删除该值。若运行时发现值已经在,则表示程序已经在运行,此时新运行的进程就退出;实现:略;优点:逻辑好理解;

缺点:若程序没有正常退出,共享值没有被删除,会导致程序无法再启动;

三. 线程互斥

原理:通过一个唯一标识创建进程互斥体,启动时判断互斥体是否已经存在,若存在则表示是重复进程;

实现:使用System.Threading.MutexusingSystemusingSystem.Collections.GenericusingSystem.TextusingSystem.DiagnosticsusingSystem.ReflectionusingSystem.Runtime.InteropServicesnamespaceConsoleApplication1{classProgram{///<summary///需要定义为类变量,而非局部变量///</summarystaticSystem.Threading.Mutex _mutexstaticvoidMain(string[] args){//是否可以打开新进程boolcreateNew//获取程序集Guid作为唯一标识

Attribute guid_attr = Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(),

typeof(GuidAttribute))stringguid =((GuidAttribute)guid_attr).Value_mutex=newSystem.Threading.Mutex(true

, guid,

outcreateNew)if(false==createNew){//发现重复进程}_mutex.ReleaseMutex()}}}优点:真正能做到同一个程序只允许运行一个进程。

我用的就是同花顺,在自定义板块中队以前设置的股票或者划得线会像你说的所谓记得,就是因为你每次在使用软件过程中进行设置后,在同花顺软件所属文件夹中都有一个设置保存的专门文件,用来记录你的个人设置。当然,这些设置仅限于你自己的电脑。

你如果去用其他的电脑登陆你的同花顺账号,那么仅仅只会有你加入自选或者自定义板块的股票。额不会有你做的其他技术方面如画线等设置。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7747010.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存