以下哪个Mutex表达式理想地阻止.Net应用程序的多个实例,有什么区别?

naw*_*fal 9 c# mutex multiple-instances winforms c#-2.0

通常我会看到这两段代码.两者都适用于我的情况,但我应该坚持哪些?

情况1:

bool isNew = false;
Mutex mutex = new Mutex(true, "MyApp_Mutex", out isNew);
if (!isNew)
{
    MessageBox.Show("already running.", "Multiple Instances Not Allowed",
                                        MessageBoxButtons.OK, 
                                        MessageBoxIcon.Exclamation);
    return;
}
Run Code Online (Sandbox Code Playgroud)

案例2:

Mutex mutex = new Mutex(false, "MyApp_Mutex"))            
if (!mutex.WaitOne(0, false))
{
    MessageBox.Show("already running.", "Multiple Instances Not Allowed", 
                                        MessageBoxButtons.OK, 
                                        MessageBoxIcon.Exclamation);
    return;
}
Run Code Online (Sandbox Code Playgroud)
  1. 哪两个是防止多个实例之间的理想方式?

  2. 有什么不同?

  3. 此外,我看到这样的代码:

    //if not return{
    mutex.ReleaseMutex(); 
    GC.Collect(); 
    //application.Run();
    GC.KeepAlive(mutex); 
    
    Run Code Online (Sandbox Code Playgroud)

在第二种方法下,但从来没有第一种方法.为什么会这样?或者我弄错了?

基本上,它取决于对所用参数和方法的正确理解.如果有人可以简要介绍一下,我会很感激,在阅读msdn文档时我不明白.

Dav*_*ile 8

在第一种情况下,您要求操作系统创建互斥锁,并在创建时为您提供所有权 - 这是通过第一个参数完成的initiallyOwned.该isNew参数告诉您它是否是新的互斥锁.如果它是新的,那么你保证拥有它的所有权,因为这是你用initiallyOwned参数要求的.因为它是新的,并且你拥有它,你知道没有其他的应用程序运行实例,因为如果有的话,他们已经创建了互斥锁并且他们将拥有它.

第二种情况基本上是相同的,但以稍微不同的方式完成.它不是在创建时请求所有权,而是在WaitOne通话中.WaitOne请求所有权,并等待0毫秒.如果您获得所有权,那么您就知道没有其他应用程序实例正在运行,原因与案例1相同.

至于使用哪个,据我所知,这无关紧要.第一个似乎更直观,至少对我而言.

添加新问题#3的答案

当应用程序完成时,它应该释放互斥锁,因为它拥有它.当你的应用程序退出时,.NET可能会为你发布它,但这样做是很好的做法.GC.CollectGC.KeepAlive正在处理垃圾收集.在处理控制启动的互斥锁时,我无法想到为什么需要这些调用.我将我的互斥锁声明为静态,因此它将始终在范围内,并且在我的应用程序的生命周期内不会被垃圾收集器释放.