防止多个Windows应用程序实例

时间:2014-01-21 12:30:39

标签: c# .net mutex multiple-instances single-instance

我有一个应用程序可以以两种不同的方式使用,具体取决于我是否将参数传递给main。使用以下示例代码,我可以:

- 启动多个实例,每个实例都带有唯一参数
- 启动一个没有参数的实例

static void Main(string[] args)
{
     string mutexName = "";
     if (args.Length > 0)
     {
         mutexName = args[0];
     } else 
     {
         mutexName = "NoArgs";
     }

     using (Mutex appMutex = new Mutex(false, String.Format("{0}-{1}", mutexName, appGuid)))
     {
         if (!appMutex.WaitOne(0, false))
         {
             MessageBox.Show("Instance already running");
             return;
         }

         Application.EnableVisualStyles();
         Application.SetCompatibleTextRenderingDefault(false);
         Application.Run(new Form1());
     }
 }

完美的作品!但我也希望有参数的应用程序和没有参数可以互相排斥。如在..如果一个或多个带参数的应用程序是打开的,你不能在没有参数的情况下启动它,反之亦然,如果没有args的程序打开,你就无法用args启动任何程序。

有没有人知道如何才能做到这一点?我尝试了使用互斥锁的不同方法,我开始认为这不能通过互斥锁完成。或者我需要“组”互斥或其他东西。

1 个答案:

答案 0 :(得分:0)

您说如果启动NoArgs应用程序,则无法启动其他应用程序。所以请亲自检查一下。

然后:

  • 如果您在没有args的情况下启动应用程序,只有在没有启动应用程序的情况下才能启动。
  • 如果您使用args启动应用程序,则可以在未使用相同名称的互斥锁启动应用程序时启动它。

如果已经启动了剩余的应用程序,则无法使用互斥锁确定。为此,您需要计数互斥锁,也称为信号量。您可以使用信号量来确定启动的应用程序数量。然后,您需要一个用于“NoArgs”情况的互斥锁,每个参数传递的互斥锁名称的互斥锁,以及一个计算成功启动的应用程序的信号量。