前言
在做机房收费系统中又考虑到一个问题,我最后打包后的应用程序如果多次打开又会出现怎么样的情形呢?果不其然,竟然出现多个程序的画面。如果用户没有关闭当前运行的应用程序,又打开同样的程序的话,那么由于两个程序占用同一个端口,这时就会产生错误。下面就用两种方法为大家介绍下如何避免这种问题的发生。
方法一:使用互斥量禁止程序运行多次
源代码
private void Frm_Main_Load(object sender, EventArgs e) { bool Exist;//定义一个bool变量,用来表示是否已经运行 //创建Mutex互斥对象 System.Threading.Mutex newMutex = new System.Threading.Mutex(true,"仅一次",out Exist); if (Exist)//如果没有运行 { newMutex.ReleaseMutex();//运行新窗体 } else { MessageBox.Show("本程序一次只能运行一个实例!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);//弹出提示信息 this.Close();//关闭当前窗体 } }
关键技术
Mutex类:表示一个同步基元,也可用于进程间同步。
语法如下:
Public Mutex(boolinitiallyOwned,string name,out bool createdNew)
参数说明
- initiallyOwned:如果为True,则给予调用线程已命名的系统互斥体的初始所属权。
- Name:Mutex的名称,如果未NULL,则Mutex使未命名的。
- createdNew:在该方法返回时,如果创建了局部互斥体或指定的命名系统互斥体,则包含布尔值true;如果指定的命名系统互斥体已存在,在为False
4.
ReleaseMutex方法:用来释放Mutex对象
说明:Mutex类位于System.Threading命名空间下
方法二:使用进程名禁止程序多次运行
通过判断进程名来实现禁止程序运行多次
源代码
private void Frm_Main_Load(object sender, EventArgs e) { bool Exist;//定义一个bool变量,用来表示是否已经运行 //创建Mutex互斥对象 System.Threading.Mutex newMutex = new System.Threading.Mutex(true,"仅一次",out Exist); if (Exist)//如果没有运行 { newMutex.ReleaseMutex();//运行新窗体 } else { MessageBox.Show("本程序一次只能运行一个实例!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);//弹出提示信息 this.Close();//关闭当前窗体 } }
关键技术
(1).Path类的GetFileNameWithoutExtension方法
该方法用来返回不具有扩展名的指定路径字符串的文件名
语法规则
Public static string GetFileNameWithoutExtension(stringpath)
参数说明
- Path:文件路径
- 返回值:包含由GetFileName返回的字符串string
(2)Process类的GetProcessesByName方法
用来创建新的Process组件的数组,并将它们与共享指定的进程名称的所有现有进程资源关联。
语法规则
Public static Process[] GetProcessesByName(stringprocessName)
参数说明
- processname:进程的友好名称
- 返回值:Process类型的数组,表示运行指定应用程序或文件的进程资源。
小结:
方法一是通过一个Mutex类来创建一个互斥的量的应用程序,然后通过判断应用程序是否已经打开,如果打开的话,则关闭现有的应用程序;方法二则是通过Path类来先得到应用程序的运行路径,然后根据路径来创建相应的应用程序数组,最后通过数组长度来来判断当前打开的应用程序的实例,如果数组值大于1的话,则给出提示。