我有一个应用程序“myprogram.exe”,它调用dll中的函数和代码,其中一个函数是“myprogram.exe”调用创建一个winform的新实例,“MyForm.cs”然后显示它使用form.show();.
我可以运行'n'个“myprogram.exe”实例,但我希望每个“myprogram.exe”实例只有一个“MyForm.cs”实例。
我遇到的问题是,我甚至认为我在“MyForm.cs”中使用互斥锁来创建互斥锁,并询问它的实例是否已经在运行,有时它会创建另一个实例,尽管有互斥锁。
我可以使用另一种方法来验证“myprogram.exe”的实例是否已经创建了“MyForm.cs”的实例。
答案 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