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;
}
}
}