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

Предложения для использования ToTitleCase не будут работать на строки, которые являются всем верхним регистром. Таким образом, Вы собираетесь, должны назвать ToUpper на первом символе и ToLower на оставшихся символах.

12
задан Lloyd Powell 30 July 2009 в 14:55
поделиться

5 ответов

Обычный метод для этого - создать именованный 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");
    }
}
9
ответ дан 2 December 2019 в 07:03
поделиться

Я решил эту проблему с помощью этого

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

, это просто,

8
ответ дан 2 December 2019 в 07:03
поделиться

С благодарностью гг. Аллену и Пауэллу :

    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);
            }
        }
    }
4
ответ дан 2 December 2019 в 07:03
поделиться
1
ответ дан 2 December 2019 в 07:03
поделиться

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

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

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

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

0
ответ дан 2 December 2019 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: