1

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

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

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

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

4

2 回答 2

4

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

这个对另一个问题的回答展示了正确的方法:

K. Scott Allen 有一篇很好的文章,介绍了为此目的使用 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());
   }
}
于 2009-06-19T09:43:20.577 回答
1

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

于 2010-04-13T10:11:56.523 回答