在dotnet核心中,如何确保仅运行我的应用程序的一个副本?

Loo*_*fer 1 singleton mutex console-application .net-core

过去我做过这样的事情

private static bool AlreadyRunning()
{
    var processes = Process.GetProcesses();
    var currentProc = Process.GetCurrentProcess();
    logger.Info($"Current proccess: {currentProc.ProcessName}");
    foreach (var process in processes)
    {
        if (currentProc.ProcessName == process.ProcessName && currentProc.Id != process.Id)
        {
            logger.Info($"Another instance of this process is already running: {process.Id}");
            return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

哪个效果很好。在新的dotnet核心世界中,所有内容的进程名称都为,dotnet因此我一次只能运行一个dotnet应用程序!不是我想要的:D

在dotnet中有理想的方法吗?我看到了建议的互斥锁,但是我不确定我是否理解在Windows机器以外的其他系统上运行的可能的缺点或错误状态。

Set*_*Set 5

.NET Core现在支持全局命名的互斥锁。从PR description,添加了该功能:

  • 在支持线程进程共享的健壮递归互斥体的系统上,将使用它们
  • 在其他系统上,使用文件锁。不幸的是,文件锁在阻塞的等待调用中没有超时,并且我没有找到其他具有必要属性的定时等待的同步对象,因此对定时等待进行了轮询。

另外,在Unix发行版中不支持的关于互斥体名称的命名互斥体中有一个有用的注释,应该使用:

默认情况下,名称具有会话范围,并且会话在Unix上更为细化(每个终端都有自己的会话)。尝试在名称前加上“ Global”前缀减去引号。