要求:
A。 1个用户登录可以在System.Windows.Form
的1台物理计算机上打开0-1 ProcessName
个实例。
B。 2个不同的用户登录都可以在System.Windows.Form
的1台物理计算机上打开0-1 ProcessName
个实例。
C。 MutexChecker
在其自己的类中,而不是Form
的成员,因为根据用户操作,处置互斥锁的责任从一种形式更改为另一种形式。
D。在Mutex创建之后,所谓的Form
是异步启动的。所以我无法实现using
声明。
问题:
在其他SO帖子上,我看到类似下面的代码标记为“不安全”。但是,没有给出代码被标记为“不安全”的原因。相反,提供global mutex作为解决方案。全局互斥体在机器范围内工作,因此不符合要求。
我尝试了什么:
从mutexChecker.RunCheck()
System.Windows.Form
public class MutexChecker:IDisposable
{
private Mutex mutex;
public bool RunCheck()
{
bool createdNew;
mutex = new Mutex(initiallyOwned: true, name: "AppName", createdNew: out createdNew);
if (!createdNew)
{
MessageBox.Show("AppName is already running. Please complete the other note before opening a new window.");
}
return createdNew;
}
public void Dispose()
{
mutex.ReleaseMutex();//ERROR: safe handle has been disposed
mutex.Dispose();//Does not always release the mutex for some unknown reason
}
在Form.Dispose
期间处理互斥锁。
问题
如何安全地创建满足要求的互斥锁?
答案 0 :(得分:0)
为了处理以异步方式处理我的Mutex
的多个表单,我提出event
来指定处理时间。否则,我只是在构建后立即转储不必要的互斥锁:
public class MutexChecker
{
private Mutex mutex;
private const string instanceName = "AppName";
private bool createdNew = false;
public bool RunCheck()
{
mutex = new Mutex(initiallyOwned: true, name: instanceName, createdNew: out createdNew);
if (createdNew)
{
HelperClass.shutdown += Dispose;
}
else
{
MessageBox.Show("AppName is already running. Please complete the other note before opening a new window.");
mutex.Dispose();//dump...I don't need this instance
}
return createdNew;
}
void Dispose()
{
HelperClass.shutdown -= Dispose;
mutex.Dispose();
}
}