为了账号安全,请及时绑定邮箱和手机立即绑定

进程里好像也找不到啊?哪位大虾知道怎么回事?

进程里好像也找不到啊?哪位大虾知道怎么回事?

C PHP
饮歌长啸 2023-03-03 14:10:17
有个问题:在关掉它之后再想运行,就会提示“同一目录的程序,同时只能运行一个”。右下角也没有显示它的图标啊,难道它在后台运行?
查看完整描述

2 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

在进程中可以找到的,应该是程序的设置有什么问题吧。

查看完整回答
反对 回复 2023-03-06
?
慕仙森

TA贡献1827条经验 获得超7个赞

有时候需要只允许程序只能同时运行一个实例。实现方式有很多。
一. 进程互斥
原理:通过获取系统进程列表,如果发现有重名的,则表示程序已经运行了,此时新运行的进程就退出;
实现: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.MutexusingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Diagnostics;usingSystem.Reflection;usingSystem.Runtime.InteropServices;namespaceConsoleApplication1{classProgram{///<summary///需要定义为类变量,而非局部变量///</summarystaticSystem.Threading.Mutex _mutex;staticvoidMain(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();}}}优点:真正能做到同一个程序只允许运行一个进程。 


查看完整回答
反对 回复 2023-03-06
  • 2 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信