为什么Mutex.WaitOne()会立即返回WPF?

时间:2011-01-11 08:19:51

标签: c# wpf

我正在尝试为每个用户会话实现SigleInstance应用程序。我正在使用本地互斥锁。我有以下启动代码。

public partial class App : Application
{
    private const string applicationName = "EDisc.Client.Application";
    private const string appGUID = "2AE55EA7-B392-42EF-BDFA-3DAFCE2B4B32";
    public App()
    {
        bool isUnique = false;
        using (var mutex = new Mutex(false, appGUID))   //Local mutex is local to the machine,it is per user,If u need a instance per machine,prefix appGUID with global.
        {
            try
            {
                try
                {
                    isUnique = mutex.WaitOne(TimeSpan.FromSeconds(3), true); //wait in case first instance is shutting down.
                    if (isUnique)   //If this is the first process.
                    {
                        this.Navigated += new NavigatedEventHandler(App_Navigated);
                        this.Exit += new ExitEventHandler(App_Exit);
                        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
                        this.DispatcherUnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);
                    }
                    else      //If process is already running.
                    {
                        LoggingHelper.LogMessage(CommonMessages.ANOTHER_APP_INSTANCE_OPEN, Source.EDiscClientApplication);
                        MessageBox.Show(CommonMessages.CLOSE_OTHER_APP_INSTANCE, CommonMessages.ANOTHER_APP_INSTANCE_OPEN,
                            MessageBoxButton.OK,
                            MessageBoxImage.Exclamation);
                        CloseApplicationInstance();
                        return;
                    }
                }
                catch (AbandonedMutexException)
                {

                }

            }
            finally
            {
                if (isUnique)
                    mutex.ReleaseMutex();
            }
        }

    }
}

isUnique始终为true,无论它是第一个实例还是第二个实例。 mutex.waitone()立即返回而不等待。我一直在为这段代码中可能出错的东西而烦恼。请帮忙

2 个答案:

答案 0 :(得分:3)

您的代码在App构造函数的末尾释放互斥锁 - 只保留几微秒(在注册这些事件处理程序时)。您必须移动ReleaseMutex()调用(以及using语句完成的Dispose()调用)才能在关闭应用程序时运行。

答案 1 :(得分:0)

我相信发生的事情是你在construtor的finally块中发布了互斥锁。当构造函数退出时,您将释放互斥锁,因此应用程序的下一个实例也可以获取此互斥锁。 您也可以尝试:

public Mutex( bool initiallyOwned, string name, out bool createdNew )

因此,如果互斥锁已由另一个进程创建,则检查out参数将返回false