阻止 运行 个单一应用的多个实例

Prevent running multiple instances of a mono app

我知道如何防止 运行 给定应用在 Windows 上出现多个实例:

Prevent multiple instances of a given app in .NET?

此代码在 Linux 下无法使用单开发。它编译并运行但它不工作。如何在 Linux 下使用单声道来防止它?

这是我尝试过的方法,但代码 deos 在 linux 下仅在 windows 下不起作用。

    static void Main()
    {
        Task.Factory.StartNew(() =>
        {
            try
            {
                var p = new NamedPipeServerStream("SomeGuid", PipeDirection.In, 1);
                Console.WriteLine("Waiting for connection");
                p.WaitForConnection();
            }
            catch
            {
                Console.WriteLine("Error another insance already running");
                Environment.Exit(1); // terminate application
            }
        });
        Thread.Sleep(1000);


        Console.WriteLine("Doing work");
        // Do work....
        Thread.Sleep(10000);            
    }

我想到了这个答案。调用此方法并为其传递一个唯一 ID

    public static void PreventMultipleInstance(string applicationId)
    {
        // Under Windows this is:
        //      C:\Users\SomeUser\AppData\Local\Temp\ 
        // Linux this is:
        //      /tmp/
        var temporaryDirectory = Path.GetTempPath();

        // Application ID (Make sure this guid is different accross your different applications!
        var applicationGuid = applicationId + ".process-lock";

        // file that will serve as our lock
        var fileFulePath = Path.Combine(temporaryDirectory, applicationGuid);

        try
        {
            // Prevents other processes from reading from or writing to this file
            var _InstanceLock = new FileStream(fileFulePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
            _InstanceLock.Lock(0, 0);
            MonoApp.Logger.LogToDisk(LogType.Notification, "04ZH-EQP0", "Aquired Lock", fileFulePath);

            // todo investigate why we need a reference to file stream. Without this GC releases the lock!
            System.Timers.Timer t = new System.Timers.Timer()
            {
                Interval = 500000,
                Enabled = true,
            };
            t.Elapsed += (a, b) =>
            {
                try
                {
                    _InstanceLock.Lock(0, 0);
                }
                catch
                {
                    MonoApp.Logger.Log(LogType.Error, "AOI7-QMCT", "Unable to lock file");
                }
            };
            t.Start();

        }
        catch
        {
            // Terminate application because another instance with this ID is running
            Environment.Exit(102534); 
        }
    }