云点博客-关注全栈开发云点博客

关注全栈开发
提升用户体验

C# 两种方式实现同时只有一个进程实例在运行

我们开发的程序有时候不允许当前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("程序已经在运行了");     }  }

第二种方式可以避免静默重启造成的误会

上面两种方式都可以作为禁止第二个实例运行的解决方案 , 我个人平常使用都是第一种方式

好了就这些了

赞(0) 打赏