Инициализация Mutex внутри метода C# всегда возвращает положительный созданный

Я создал простой MutexManager:

public static class MutexManager
{
    private static string mutexName
    {
        get
        {
            return "MyAppName" + System.Security.Principal.WindowsIdentity.GetCurrent().User.AccountDomainSid;
        }
    }

    public static bool CreateApplicationMutex()
    {

        bool createdNew;
        var mutex = new Mutex(false, mutexName, out createdNew);                       

        return createdNew;
    }
}

Проблема в том, что CreateApplicationMutex всегда возвращает true при запуске нового экземпляра приложения. До тех пор, пока у меня был точно такой же код в app.cs, все было правильно, но после того, как я переместил его в MutexManager, createNew всегда имеет значение true. Что я делаю неправильно?

1 ответ

У меня была аналогичная проблема, причина в сроке жизни переменной мьютекса. Следующий код отлично работает в отладочной версии, но всегда возвращает true для created_new в версии выпуска:

using System;

static class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        string mutex_name = "MyApplicationName_SingleInstanceMutex";
        bool created_new = false;
        System.Threading.Mutex mutex = new System.Threading.Mutex(false, mutex_name, out created_new);
        if (!created_new)
        {
            System.Windows.Forms.MessageBox.Show("Application is already started!");
            return;
        }
        
        /* Create & run mainForm here */
    }
}

Создание статического мьютекса решает проблему:

using System;

static class Program
{
    static System.Threading.Mutex mutex = null;

    [STAThread]
    static void Main(string[] args)
    {
        string mutex_name = "MyApplicationName_SingleInstanceMutex";
        bool created_new = false;
        mutex = new System.Threading.Mutex(false, mutex_name, out created_new);
        if (!created_new)
        {
            System.Windows.Forms.MessageBox.Show("Application is already started!");
            return;
        }
        
        /* Create & run mainForm here */
    }
}

Следующее работает, как и ожидалось для меня, и возвращает ложь на втором экземпляре

public static class MutexManager
{
   private static string mutexName => "MyAppName" + System.Security.Principal.WindowsIdentity.GetCurrent()
                                                            .User?.AccountDomainSid;
   public static bool CreateApplicationMutex()
   {
      new Mutex(false, mutexName, out var createdNew);

      return createdNew;
   }
}

private static void Main(string[] args)
{
   Console.WriteLine(MutexManager.CreateApplicationMutex());
   Console.ReadKey();
}

Выход

true
false

Убедитесь, что вы отлаживаете свое приложение и проверяете имя мьютекса

Обновить

Winforms

MessageBox.Show(
   MutexManager.CreateApplicationMutex()
               .ToString());
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());

WPF

public partial class App : Application
{
   protected override void OnStartup(StartupEventArgs e)
   {
      MessageBox.Show(
         MutexManager.CreateApplicationMutex()
                     .ToString());
      base.OnStartup(e);
   }
}

Еще раз это работает как ожидалось, и не может быть воспроизведено

Другие вопросы по тегам