запретить приложению c# запуск нескольких экземпляров

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

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

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

7 ответов


рекомендуемый способ сделать это-с помощью системного мьютекса.

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

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

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


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

Process[] lprcTestApp = Process.GetProcessesByName("TestApplication");
if (lprcTestApp.Length > 0)
{
      // The TestApplication is already running, don't run it again
}

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


посмотри сообщение в блоге Scotts и не foolished имя сборки. Это просто имя файла стандартного файла в .Net framework.

вот больше информации непосредственно из MSDN для WindowsFormsApplicationBase.


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

Ура, Маттиас


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

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


решение в приложении Windows form снова запретить запуск приложения (повторно открыть приложение).

1-Сначала добавьте класс RunAlready.cs

2-вызов метода processIsRunning () с именем Process из RunAlready.cs в программе.cs