всего 3 параметра)

шлом я делал что-то вроде этого

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;
}

Который сработал хорошо. В новом мире ядра DotNet все имеет имя процессаdotnet так что я могу запустить только одинdotnet приложение за один раз! Не совсем то, что я хочу: D

Есть ли идеальный способ сделать это в DotNet? Я вижу предложенный мьютекс, но я не уверен, что понимаю возможные недостатки или состояния ошибок, возникающие в других системах, кроме компьютера с Windows.

Ответы на вопрос(2)

Решение Вопроса

.. ИзПиар описание, который добавил эту функциональность:

В системах, которые поддерживают надежные рекурсивные мьютексы, совместно используемые процессами, они будут использоватьсяВ других системах используются блокировки файлов. У блокировок файлов, к сожалению, нет тайм-аута в блокирующем вызове ожидания, и я не нашел другого синхронизирующего объекта с синхронизированным ожиданием с необходимыми свойствами, поэтому опрос выполняется для синхронизированных ожиданий.

Также есть полезная заметка вИменованный мьютекс не поддерживается в Unix вопрос об имени мьютекса, который следует использовать:

По умолчанию имена имеют область действия сеанса, а сеансы более детализированы в Unix (каждый терминал получает свой собственный сеанс). Попробуйте добавить префикс «Global» к имени без кавычек.

Я взял код отсюдаЧто такое хороший шаблон для использования Global Mutex в C #?

Версия ядра, которую я использую, похоже, не имеет некоторых настроек безопасности, поэтому я просто удалил ее. Я уверен, что все будет хорошо. (new Mutex всего 3 параметра)

    private static void Main(string[] args)
    {
        LogManager.Configuration = new XmlLoggingConfiguration("nlog.config");
        logger = LogManager.GetLogger("console");
        logger.Info("Trying to start");

        const string mutexId = @"Global\{{guid-guid-guid-guid-guid}}";

        bool createdNew;
        using (var mutex = new Mutex(false, mutexId, out createdNew))
        {
            var hasHandle = false;
            try
            {
                try
                {
                    hasHandle = mutex.WaitOne(5000, false);
                    if (!hasHandle)
                    {
                        logger.Error("Timeout waiting for exclusive access");
                        throw new TimeoutException("Timeout waiting for exclusive access");
                    }
                }
                catch (AbandonedMutexException)
                {
                    hasHandle = true;
                }

                // Perform your work here.
                PerformWorkHere();
            }
            finally
            {
                if (hasHandle)
                {
                    mutex.ReleaseMutex();
                }
            }
        }
    }

Ваш ответ на вопрос