当前位置:  开发笔记 > 编程语言 > 正文

C#互斥锁等效于ERROR_ALREADY_EXISTS

如何解决《C#互斥锁等效于ERROR_ALREADY_EXISTS》经验,为你挑选了1个好方法。

我正在尝试创建一个跨进程互斥体,并确保只有一个实例正在运行。

我将这些代码放入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#代码有什么问题?

注意:我没有发布互斥锁,因为这是最小的情况。



1> Pavel Anikho..:

您可以尝试使用此代码段检查Mutex已存在的代码并关闭该过程

var mutex = new Mutex(false, name, out bool createdNew);
if (!createdNew)
{
    //already created
}

另一个选择是使用WaitOnemethod并传递一些超时,如该代码段所示

var mutex = new Mutex(false, name);
if (mutex.WaitOne(TimeSpan.Zero))
{
    //doesn't created                   
}
else
{
    //already exists, one instance is created                   
}

关于单实例应用程序,还有一篇不错的文章。它很旧并且与WinForms有关,但是我希望这个想法是一样的

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有