如何避免多个应用程序实例?

时间:2009-06-18 23:05:33

标签: c# dll mutex

我有一个应用程序“myprogram.exe”,它调用dll中的函数和代码,其中一个函数是“myprogram.exe”调用创建一个winform的新实例,“MyForm.cs”然后显示它使用form.show();.

我可以运行'n'个“myprogram.exe”实例,但我希望每个“myprogram.exe”实例只有一个“MyForm.cs”实例。

我遇到的问题是,我甚至认为我在“MyForm.cs”中使用互斥锁来创建互斥锁,并询问它的实例是否已经在运行,有时它会创建另一个实例,尽管有互斥锁。

我可以使用另一种方法来验证“myprogram.exe”的实例是否已经创建了“MyForm.cs”的实例。

2 个答案:

答案 0 :(得分:4)

根据@ Joe的评论,问题很可能出在Mutux的实现上。

This answer to another question演示了正确的方法:

  

ķ。 Scott Allen a good write up为此目的使用Mutex并且您将遇到GC的问题。

     
    

如果我想在机器上的所有会话中只运行一个应用程序实例,我可以将命名的互斥锁放入带有前缀“Global \”的全局命名空间。

[STAThread]
static void Main() 
{
   using(Mutex mutex = new Mutex(false, "Global\\" + appGuid))
   {
      if(!mutex.WaitOne(0, false))
      {
         MessageBox.Show("Instance already running");
         return;
      }

Application.Run(new Form1());
   }
}
  

答案 1 :(得分:1)

我发布了以下链接,因为我在C ++和MFC中找不到任何相关文章。因此, 对于C ++,MFC和Win32,您可以使用http://flounder.com/nomultiples.htm