单例实例使用互斥锁

时间:2013-07-10 06:32:47

标签: singleton mutex

我希望有一个可以跨进程共享的单例类。所以我自然地在.NET 4.0中使用了Mutex。

现在我有两个运行相同应用程序的实例。一个修改了这个Singleton的“Name”属性,我想要的只是另一个应用程序来获取此更改。但即使在第一个实例发布Mutex之后,第二个实例也无法在WaitOne调用中成功。我想知道为什么以及我在下面的代码中做错了什么?请注意,入口点是RunSingletonAcrossProcesses()方法。

这是我的Singleton Class

public class SingletonAcrossProcesses
{

private static SingletonAcrossProcesses _instance;

private static Mutex _mutex = new Mutex(true, @"Global\" + "sivablogz.wordpress.com SingletonMutexDemo");

    protected SingletonAcrossProcesses()
    {
    }

    public static SingletonAcrossProcesses GetInstance()
    {
        if (_mutex.WaitOne(TimeSpan.Zero, true))
        {
            if (_instance == null)
            {
                _instance = new SingletonAcrossProcesses();
            }
            _mutex.ReleaseMutex();
        }            

        return _instance;                            
    }

    public string Name { get; set; }

    public static void RunSingletonAcrossProcesses()
    {
        Console.WriteLine("Press any key to Instantiate the singleton...");
        Console.ReadLine();
        SingletonAcrossProcesses instance = SingletonAcrossProcesses.GetInstance();

        if (instance != null)
        {
            if (String.IsNullOrEmpty(instance.Name))
            {
                Console.WriteLine("Enter a name for the instance...");
                instance.Name = Console.ReadLine();
            }
            Console.WriteLine("The Instance name is: " + instance.Name);
        }
        else
            Console.WriteLine("The Singleton Instance could not be obtained.");            
        Console.WriteLine("Press any key to terminate...");
        Console.ReadLine();
    }
}

提前致谢,

希瓦

1 个答案:

答案 0 :(得分:0)

您似乎遇到了这个问题:

  

如果name不为null且initialOwned为true,则仅当作为此调用的结果创建了指定的系统互斥锁时,调用线程才拥有互斥锁。由于没有用于确定是否已创建命名系统互斥锁的机制,因此最好在调用此构造函数重载时为initialOwned指定false。如果需要确定初始所有权,可以使用Mutex(布尔值,字符串,布尔值)构造函数。

见这里:http://msdn.microsoft.com/en-us/library/f55ddskf.aspx