namespace LanDesktopPLONDS.Installer.Services; /// /// 安装程序单实例互斥锁。 /// 使用命名互斥锁确保只有一个安装程序实例在运行。 /// public sealed class InstallerSingleInstance : IDisposable { /// /// 全局互斥锁名称。 /// public const string MutexName = @"Global\LanDesktopPLONDS.Installer"; private Mutex? _mutex; private bool _disposed; /// /// 尝试获取单实例互斥锁。 /// /// 如果成功获取锁返回 true;如果已有实例运行返回 false。 public bool TryAcquire() { if (_disposed) { throw new ObjectDisposedException(nameof(InstallerSingleInstance)); } _mutex = new Mutex(false, MutexName, out var createdNew); if (!createdNew) { _mutex.Dispose(); _mutex = null; return false; } return true; } /// /// 释放互斥锁。 /// public void Dispose() { if (_disposed) { return; } _disposed = true; if (_mutex != null) { try { _mutex.ReleaseMutex(); } catch { // 释放已释放的互斥锁时忽略 } _mutex.Dispose(); _mutex = null; } } }