我正在尝试为每个用户会话实现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()立即返回而不等待。我一直在为这段代码中可能出错的东西而烦恼。请帮忙
答案 0 :(得分:3)
您的代码在App构造函数的末尾释放互斥锁 - 只保留几微秒(在注册这些事件处理程序时)。您必须移动ReleaseMutex()
调用(以及using语句完成的Dispose()
调用)才能在关闭应用程序时运行。
答案 1 :(得分:0)
我相信发生的事情是你在construtor的finally块中发布了互斥锁。当构造函数退出时,您将释放互斥锁,因此应用程序的下一个实例也可以获取此互斥锁。 您也可以尝试:
public Mutex(
bool initiallyOwned,
string name,
out bool createdNew
)
因此,如果互斥锁已由另一个进程创建,则检查out参数将返回false