使用Mutex运行应用程序的单个实例

bli*_*egz 22 c# mutex

为了只允许运行应用程序的单个实例,我正在使用互斥锁.代码如下.这是正确的方法吗?代码中是否有任何缺陷?

当用户第二次尝试打开应用程序时,如何显示已在运行的应用程序.目前(在下面的代码中),我只是显示另一个实例已在运行的消息.

    static void Main(string[] args)
    {
        Mutex _mut = null;

        try
        {
            _mut = Mutex.OpenExisting(AppDomain.CurrentDomain.FriendlyName);
        }
        catch
        {
             //handler to be written
        }

        if (_mut == null)
        {
            _mut = new Mutex(false, AppDomain.CurrentDomain.FriendlyName);
        }
        else
        {
            _mut.Close();
            MessageBox.Show("Instance already running");

        }            
    }
Run Code Online (Sandbox Code Playgroud)

Pet*_*r D 14

我这样做了一次,我希望它有所帮助:

bool createdNew;

Mutex m = new Mutex(true, "myApp", out createdNew);

if (!createdNew)
{
    // myApp is already running...
    MessageBox.Show("myApp is already running!", "Multiple Instances");
    return;
}
Run Code Online (Sandbox Code Playgroud)

  • 此代码不安全或不正确:http://stackoverflow.com/questions/229565/what-is-a-good-pattern-for-using-a-global-mutex-in-c/229567 (20认同)
  • 我不同意Sam的评论(和downvotes).该代码不使用互斥锁同步.相反,互斥锁仅用于确定是否已由另一个进程创建,并且在进程终止时将被销毁,包括异常终止.我认为这是安全和正确的,直到看到解释为什么它是不正确的.问题可能是一个流氓应用程序抓住互斥锁,并且该进程在不同的会话中运行两次.前者是破坏,后者被问题覆盖("*用户*试图第二次打开应用程序"). (4认同)
  • 我希望这是安全和正确的.这很简单,很容易写,几乎没有任何想法大声笑.但是,对你们两个人来说都是+1. (3认同)

Mil*_*len 7

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

    GC.Collect();                
    Application.Run(new Form1());
  }
}
Run Code Online (Sandbox Code Playgroud)

资料来源:http://odetocode.com/Blogs/scott/archive/2004/08/20/401.aspx