繁体   English   中英

使用c#Mutex类的这种替代方式是否有任何损失?

[英]Are there any loss in this alternative way of using c# Mutex class?

我有一个使用Mutex的应用程序(我没有写这个):

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

    try
    {
        mutex = Mutex.OpenExisting("SINGLEINSTANCE");

        if (mutex != null)
        {
            return;
        }
    }
    catch (WaitHandleCannotBeOpenedException ex)
    {
        mutex = new Mutex(true, "SINGLEINSTANCE");
    }

    // critical section here
}

但是我知道正确的方法是这样的:

private readonly Mutex m = new Mutex("SINGLEINSTANCE");
static void Main(string[] args) {
    m.WaitOne();
    try {
        /* critical code */
    }
    finally {
        m.ReleaseMutex();
    }
}

这样做是因为该应用程序只能同时运行一个进程。 它是一个控制台应用程序,为Web应用程序执行一些异步工作。

该代码正在生产中,我不想更改它,除非此代码有一些大问题...存在吗?

旧代码有一个竞争条件,其中两个进程可以尝试同时启动,第二个启动将引发异常并在new Mutex(true, "SINGLEINSTANCE");上崩溃new Mutex(true, "SINGLEINSTANCE"); 线。 如果互斥体已经存在,并且您没有争用条件,则程序将正常退出,并且从不执​​行关键部分。

您的新代码无法编译,因为您没有为Mutex使用有效的构造函数,但是,如果您传入的是false您的代码将等待先前的互斥锁被释放,然后它将继续执行关键部分,而不会退出程序早。

“正确”的方法是将两种方法结合起来,尝试创建互斥锁,并使用重载与out参数来查看您是否是互斥锁的所有者。

static void Main(string[] args)
{
    bool taken;
    using(Mutex mutex = new Mutex(true, "SINGLEINSTANCE", out taken))
    {
        if(!taken)
            return;
        try
        {
            // critical section here
        }
        finally
        {
            mutex.ReleaseMutex();
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM