WPF 使用互斥锁Mutex实现应用程序启动唯一实例,避免重复启动

C#中的Mutex是互斥锁,位于命名空间System.Threading中,它是一个互斥的对象,同一时间只有一个线程可以拥有它,该类还可用于进程间同步的同步基元。在系统运行过程中,如果当前有一个线程或者进程拥有它,在没有释放之前,其它线程或进程是没有权利拥有它的,并且使用其构造函数创建对象时设置的name是在系统中唯一的,如:

/*创建具有唯一名称的互斥锁*/
AppMutex = new Mutex(true, "TopToolsApp", out var createdNew);

其中名称“TopToolsApp”在系统中唯一,使用以上的构造函数,可以进行判断当前名称的互斥锁是否可以创建新的,前提是其他线程或进程没有创建该同名的互斥锁,返回参数“createdNew”为false时,表示系统中存在其他线程使用了同名的互斥锁,因此,可以利用这个特性来实现应用程序的唯一启动实例,如:

protected override void OnStartup(StartupEventArgs e)
{
	/*创建具有唯一名称的互斥锁*/
	AppMutex = new Mutex(true, "TopToolsApp", out var createdNew);

	if (!createdNew)
	{
		var current = Process.GetCurrentProcess();

		foreach (var process in Process.GetProcessesByName(current.ProcessName))
		{
			if (process.Id != current.Id)
			{
				Win32Helper.SetForegroundWindow(process.MainWindowHandle);
				break;
			}
		}
		Shutdown();
	}
	else
	{
		//var splashScreen = new SplashScreen("Resources/Img/Cover.png");
		//splashScreen.Show(true);

		base.OnStartup(e);
	}
}

Win32Helper.SetForegroundWindow的具体实现为:

[DllImport("user32.dll", EntryPoint = "SetForegroundWindow", SetLastError = true)]
public static extern void SetForegroundWindow(IntPtr hwnd);

如果需要在程序中使用该互斥锁来实现数据的更新,同时避免同一时刻有其他线程操作,可以使用Mutex.WaitOne()方法等待Mutex对象被释放,如果它等待的Mutex对象被释放了,它就自动拥有这个对象,直到它调用Mutex.ReleaseMutex()方法释放这个对象,而在此期间,其他想要获取这个Mutex对象的线程都只有等待。

你可能感兴趣的:(C#)