我们开发的程序有时候不允许当前PC再有第二个当前实例运行 , 本文介绍两种方式来实现我们想要的这种功能--同时只能有一个实例运行
1 . 利用C#中的互斥量
这种方法有个弊端 , 在程序运行时需要重启应用程序的时候会出现问题,在没有同意程序运行的情况下,仍然提示程序在运行了.
以下是实现代码
#region 只能运行一个客户端程序 bool flag = false; //第一个参数:true--给调用线程赋予互斥体的初始所属权 //第一个参数:互斥体的名称 //第三个参数:返回值,如果调用线程已被授予互斥体的初始所属权,则返回true System.Threading.Mutex mutex = new System.Threading.Mutex(true, "CarroitBrowser", out flag); if (!flag) { MessageBox.Show("只能运行一个客户端程序!", "请确定", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); Environment.Exit(1);//退出程序 } #endregion
普通程序使用上面的这种方式足可以达到目的了
2.采用判断进程的方式 , 我们在运行程序前 , 查找进程中是否有同名的进程 , 同时运行位置也相同程 , 如是没有运行该程序 , 如果有就就不运行 . 在C#中应用System.Diagnostics名字空间中的Process类来实现
以下是实现代码
/// <summary> /// 判断是否运行进程 /// </summary> /// <returns></returns> public static System.Diagnostics.Process RunningInstance() { System.Diagnostics.Process current = System.Diagnostics.Process.GetCurrentProcess(); System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcesses(); foreach (System.Diagnostics.Process process in processes) //查找相同名称的进程 { if (process.Id != current.Id) //忽略当前进程 { if (process.ProcessName == current.ProcessName)//判断进程名称是否和当前运行进程名称一样 { return process; } } } return null; }
然后更改Main函数如下
/// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { if (RunningInstance() == null) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Browser()); } else { MessageBox.Show("程序已经在运行了"); } }
第二种方式可以避免静默重启造成的误会
上面两种方式都可以作为禁止第二个实例运行的解决方案 , 我个人平常使用都是第一种方式
好了就这些了