如何为异步启动的表单创建安全的非全局互斥锁

时间:2013-02-06 15:46:49

标签: c# winforms mutex

要求:

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期间处理互斥锁。

问题

如何安全地创建满足要求的互斥锁?

1 个答案:

答案 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();        
    }
}