我希望有一个可以跨进程共享的单例类。所以我自然地在.NET 4.0中使用了Mutex。
现在我有两个运行相同应用程序的实例。一个修改了这个Singleton的“Name”属性,我想要的只是另一个应用程序来获取此更改。但即使在第一个实例发布Mutex之后,第二个实例也无法在WaitOne调用中成功。我想知道为什么以及我在下面的代码中做错了什么?请注意,入口点是RunSingletonAcrossProcesses()方法。
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();
}
}
提前致谢,
希瓦
答案 0 :(得分:0)
您似乎遇到了这个问题:
如果name不为null且initialOwned为true,则仅当作为此调用的结果创建了指定的系统互斥锁时,调用线程才拥有互斥锁。由于没有用于确定是否已创建命名系统互斥锁的机制,因此最好在调用此构造函数重载时为initialOwned指定false。如果需要确定初始所有权,可以使用Mutex(布尔值,字符串,布尔值)构造函数。