Chris Shain 说的是对的。您需要做的是拥有互斥锁,而不仅仅是创建它。此外,您必须在退出应用程序时手动释放互斥锁,否则其他应用程序实例可能会遇到AbandonedMutexException。
下面是一个简单的代码示例,说明您可能希望如何实现它。请注意,此特定代码要求 StartInstance() 和 StopInstance() 由同一线程调用。
private static Mutex Mutex1 = new Mutex(false, "54A8F2C1-6C11-4ED4-8A62-AD7C1D9F7970");
private static Mutex Mutex2 = new Mutex(false, "5E1C76D0-9897-412B-BD56-64A872F8FDE3");
private static Mutex AcquiredMutex;
public static bool StartInstance()
{
if (AcquiredMutex != null)
return true;
if (Mutex1.WaitOne(1))
{
AcquiredMutex = Mutex1;
}
else if (Mutex2.WaitOne(1))
{
AcquiredMutex = Mutex2;
}
return (AcquiredMutex != null);
}
public static void StopInstance()
{
if (AcquiredMutex != null)
AcquiredMutex.ReleaseMutex();
}
编辑:实际上,如果您想使用createNew作为检测多个实例的方法,您可能可以这样做,但我个人不推荐它,因为 Mutex 不是为此而设计的。
但是,即使您决定使用createNew方法,您仍然需要在应用程序退出后自己显式关闭互斥锁。
与前一种方法相比,此方法可能具有的一个优点是 Close() 方法不必由创建它的同一线程调用。
下面是一个使用createNew方法的简单代码示例。请注意,它不是线程安全的。您将需要在 StartInstance() 和 StopInstance() 中使用 lock() 以使其成为线程安全的。
private static readonly string[] MutexNames = new string[]
{
"54A8F2C1-6C11-4ED4-8A62-AD7C1D9F7970",
"5E1C76D0-9897-412B-BD56-64A872F8FDE3"
};
private static Mutex CreatedMutex;
public static bool StartInstance()
{
if (CreatedMutex != null)
return true;
foreach (string name in MutexNames)
{
bool created;
Mutex mutex = new Mutex(false, name, out created);
if (created)
{
CreatedMutex = mutex;
return true;
}
else
{
mutex.Close();
}
}
return false;
}
public static void StopInstance()
{
if (CreatedMutex != null)
CreatedMutex.Close();
}