【问题标题】:Prevent multiple windows application instances防止多个 windows 应用程序实例
【发布时间】:2014-02-11 01:14:44
【问题描述】:

我有一个可以以两种不同方式使用的应用程序,具体取决于我是否将参数传递给 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());
     }
 }

完美运行!但我也希望有参数的应用程序和没有参数的应用程序相互排斥。如..如果打开一个或多个带参数的应用程序,则无法启动一个不带参数的应用程序,反之亦然,如果打开一个不带参数的程序,则无法启动任何带参数的程序。

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

【问题讨论】:

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


    【解决方案1】:

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

    然后:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 2023-03-20
      • 2012-02-06
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      相关资源
      最近更新 更多