Подтвердить что ты не робот

Ограничить несколько экземпляров приложения

Хорошо, поэтому я создал приложение С#, создал для него установщик и установил его на моей машине.

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

Спасибо за вашу помощь,

4b9b3361

Ответ 1

Общей методикой для этого является создание имени Mutex и проверка его присутствия при запуске приложения.

Смотрите this или this.

Код из DDJ:

class App : Form
{
    Mutex mutex;

    App()
    {
        Text = "Single Instance!";
        mutex = new Mutex(false, "SINGLE_INSTANCE_MUTEX");
        if (!mutex.WaitOne(0, false)) 
        {
            mutex.Close();
            mutex = null;
        }
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
            mutex.ReleaseMutex();
        base.Dispose(disposing);
    }

    static void Main()
    {
        App app = new App();
        if (app.mutex != null) Application.Run(app);
        else MessageBox.Show("Instance already running");
    }
}

Ответ 2

Я решил эту проблему этим

[STAThread]
 static void Main()
    {

        Process[] result = Process.GetProcessesByName("ApplicationName");
        if (result.Length > 1)
        {
            MessageBox.Show("There is already a instance running.", "Information");
            System.Environment.Exit(0);
        }
        // here normal start 
    }

это просто, но у меня не было времени проверить лучшие решения.

Ответ 3

Благодаря Allen и Powell:

    static void Main() 
    {
        using (Mutex mutex = new Mutex(false, @"Global\" + appGuid)) {
            if (!mutex.WaitOne(0, false)) {
                string processName = GetProcessName();
                BringOldInstanceToFront(processName);
            }
            else {
                GC.Collect();
                Application.Run(new Voting());
            }
        }
    }

    private static void BringOldInstanceToFront(string processName) {
        Process[] RunningProcesses = Process.GetProcessesByName(processName);
        if (RunningProcesses.Length > 0) {
            Process runningProcess = RunningProcesses[0];
            if (runningProcess != null) {
                IntPtr mainWindowHandle = runningProcess.MainWindowHandle;
                NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_SHOWMINIMIZED);
            NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_RESTORE);
            }
        }
    }

Ответ 5

Я не знаю среду, в которой вы работаете, но что-то, что нужно помнить о "приложениях с одним экземпляром", - это то, как вы определяете один экземпляр. Если приложение может работать одновременно на нескольких рабочих станциях, используя общий источник данных, это проблема? Аналогично, что касается ситуации с терминальными службами (или ситуации "как работа" ), когда на один и тот же компьютер регистрируется более одного пользователя, вы хотите ограничить приложение таким образом, чтобы только один экземпляр для каждого пользователя за -Компьютер? Или вы в порядке, просто один экземпляр для пользователя?

Ответ на них может привести вас в одном направлении над другим. Например, у нас есть приложение с одним экземпляром, а область - группа компьютеров. В пределах этой группы рабочих станций допускается только один пользователь. Мы справились с этим, указав таблицу в нашем общем источнике данных, которая отслеживала пользователей, подключенных в настоящее время. Это проблема обслуживания, так как вам нужно быть уверенным, что таблица на 100% точна все время. Обработка таких вещей, как непредвиденные отключения электроэнергии на рабочей станции, оставляя "фиктивные" записи в этой таблице, требует некоторой осторожной обработки.