我正在尝试创建一个跨进程互斥体,并确保只有一个实例正在运行。
我将这些代码放入Main方法中,并启动了两个进程,但是第二个进程没有立即退出:
string name = "Global\\qweqwe"; try { new Mutex(true, name); } catch (Exception) { Console.WriteLine("Mutex already exists"); return; }
然后我切换到pinvoke,它起作用了:
string name = "Global\\qweqwe"; IntPtr mutex = CreateMutex(IntPtr.Zero, true, name); if (mutex == IntPtr.Zero) { return; } if (Marshal.GetLastWin32Error() == ERROR_ALREADY_EXISTS) { Debug.WriteLine("mutex already exists"); return; }
C#代码有什么问题?
注意:我没有发布互斥锁,因为这是最小的情况。
您可以尝试使用此代码段检查Mutex
已存在的代码并关闭该过程
var mutex = new Mutex(false, name, out bool createdNew);
if (!createdNew)
{
//already created
}
另一个选择是使用WaitOne
method并传递一些超时,如该代码段所示
var mutex = new Mutex(false, name);
if (mutex.WaitOne(TimeSpan.Zero))
{
//doesn't created
}
else
{
//already exists, one instance is created
}
关于单实例应用程序,还有一篇不错的文章。它很旧并且与WinForms有关,但是我希望这个想法是一样的