Вопрос

Итак, я создал свое приложение на c #, создал для него установщик и установил его на моем компьютере.

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

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

Это было полезно?

Решение

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

См. этот или 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");
    }
}

Другие советы

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

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

это просто, но я едва успел проверить лучшие решения.

Благодаря господам Аллен и Пауэлл :

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top