не позволяют приложению ac # запускать более одного экземпляра

Я написал программу на c # Теперь я хотел бы знать, как правильно предотвратить запуск программы, если она уже запущена?

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

Я могу это сделать, но я думал о стандартном и правильном способе.

6
задан tshepang 1 May 2014 в 09:51
поделиться

6 ответов

Рекомендуемый способ сделать это - использовать системный мьютекс.

bool createdNew;
using(var mutex = new System.Threading.Mutex(true, "MyAppName", out createdNew))
{
    if (createdNew)
        // first instance
        Application.Run();
    else
        MessageBox.Show("There is already an instace running");
}

Первый параметр ктора Mutex указывает ему создать общесистемный мьютекс для этого потока. Если мьютекс уже существует, он вернет false через 3-й параметр.

Обновление
Куда это поместить? Я бы поместил это в program.cs. Если вы поместите его в form_load, вам нужно будет держать мьютекс в течение всего времени жизни приложения (иметь мьютекс как член формы), и вручную освобождать его при выгрузке формы.
Чем раньше вы это сделаете, тем лучше, до того, как другое приложение откроет соединения с БД и т.д. и до того, как будут созданы ресурсы для форм / контролов и т.д.

10
ответ дан 8 December 2019 в 12:57
поделиться

Вы можете использовать общесистемный семафор , используя конструктор семафоров (Int32, Int32, String, Boolean%) и довольно уникальное имя.

Ура, Матиас

0
ответ дан 8 December 2019 в 12:57
поделиться

Если ваше приложение создает / потребляет файлы, вам лучше зарегистрировать общесистемный механизм связи (например, удаленное взаимодействие или конечную точку WCF или даже сокет). Затем, если второй экземпляр приложения запускается двойным щелчком по одному из ваших файлов, вы можете отправить информацию о файле в работающий экземпляр.

В противном случае, если это отдельная программа, то, как говорили другие, мьютекс или семафор будут одинаково хорошо работать.

0
ответ дан 8 December 2019 в 12:57
поделиться

Быстрый способ, который я проделал в одном из приложений .. Вы можете посмотреть список запущенных процессов, чтобы узнать, запущено ли уже текущее приложение, и не запускать приложение снова.

Process[] lprcTestApp = Process.GetProcessesByName("TestApplication");
if (lprcTestApp.Length > 0)
{
      // The TestApplication is already running, don't run it again
}
4
ответ дан 8 December 2019 в 12:57
поделиться

Взгляните на сообщение в блоге Скотта и не дайте себя обмануть названием сборки. Это просто имя стандартного файла в платформе .Net.

Дополнительная информация прямо из MSDN для WindowsFormsApplicationBase .

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

Я думаю, что перечисление списка процессов потенциально может быть медленным. Вы также можете создать Mutex с помощью класса System.Threading.Mutex и проверить, создан ли он уже при запуске процесса. Однако для этого потребуется вызов системного кода Win32, поэтому он не будет полностью независимым от платформы.

2
ответ дан 8 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

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