Предотвратить несколько экземпляров данного приложения в .NET? - PullRequest
118 голосов
/ 18 сентября 2008

В .NET, как лучше всего предотвратить одновременную работу нескольких экземпляров приложения? И если нет «наилучшего» метода, какие из предостережений следует учитывать при каждом решении?

Ответы [ 22 ]

143 голосов
/ 18 сентября 2008

Используйте Mutex. Один из приведенных выше примеров использования GetProcessByName имеет много предостережений Вот хорошая статья на эту тему:

http://odetocode.com/Blogs/scott/archive/2004/08/20/401.aspx

[STAThread]
static void Main() 
{
   using(Mutex mutex = new Mutex(false, "Global\\" + appGuid))
   {
      if(!mutex.WaitOne(0, false))
      {
         MessageBox.Show("Instance already running");
         return;
      }

      Application.Run(new Form1());
   }
}

private static string appGuid = "c0a76b5a-12ab-45c5-b9d9-d693faa6e7b9";
18 голосов
/ 18 сентября 2008
if (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length > 1)
{
  AppLog.Write("Application XXXX already running. Only one instance of this application is allowed", AppLog.LogMessageType.Warn);
  return;
}
17 голосов
/ 18 сентября 2008

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

public class Program
{
    static System.Threading.Mutex singleton = new Mutex(true, "My App Name");

    static void Main(string[] args)
    {
        if (!singleton.WaitOne(TimeSpan.Zero, true))
        {
            //there is already another instance running!
            Application.Exit();
        }
    }
}
7 голосов
/ 18 сентября 2008

У Хансельмана есть сообщение об использовании класса WinFormsApplicationBase из сборки Microsoft.VisualBasic для этого.

5 голосов
/ 18 сентября 2008

Похоже, есть 3 фундаментальных метода, которые были предложены до сих пор.

  1. Производный от класса Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase и установите для свойства IsSingleInstance значение true (Я считаю, что предостережение заключается в том, что это не будет работать с приложениями WPF, не так ли?)
  2. Используйте именованный мьютекс и проверьте, был ли он уже создан.
  3. Получить список запущенных процессов и сравнить названия процессов. (Это означает, что имя вашего процесса должно быть уникальным по сравнению с другими процессами, запущенными на компьютере данного пользователя.)

Какие-нибудь предупреждения, которые я пропустил?

4 голосов
/ 18 сентября 2008

При использовании Visual Studio 2005 или 2008 при создании проекта для исполняемого файла в окнах свойств на панели «Приложение» имеется флажок «Создать приложение с одним экземпляром», который можно активировать для преобразования приложения в приложение с одним экземпляром.

Вот снимок окна, о котором я говорю: enter image description here Это проект приложения для Visual Studio 2008.

4 голосов
/ 06 февраля 2014

Я перепробовал все решения здесь, и в моем проекте на C # .net 4.0 ничего не получалось. Надеюсь помочь кому-нибудь здесь решение, которое сработало для меня:

В качестве переменных основного класса:

private static string appGuid = "WRITE AN UNIQUE GUID HERE";
private static Mutex mutex;

Когда вам нужно проверить, запущено ли уже приложение:

bool mutexCreated;
mutex = new Mutex(true, "Global\\" + appGuid, out mutexCreated);
if (mutexCreated)
    mutex.ReleaseMutex();

if (!mutexCreated)
{
    //App is already running, close this!
    Environment.Exit(0); //i used this because its a console app
}

Мне нужно было закрыть другие экземпляры только с некоторыми условиями, это хорошо сработало для моей цели

3 голосов
/ 01 сентября 2015

1 - Создать ссылку в program.cs ->

using System.Diagnostics;

2 - поставить в void Main() как первую строку кода ->

 if (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length >1)
                return;

Вот и все.

3 голосов
/ 18 сентября 2008
2 голосов
/ 18 сентября 2008

Используйте VB.NET! Нет: действительно;)

с использованием Microsoft.VisualBasic.ApplicationServices;

WindowsFormsApplicationBase из VB.Net предоставляет вам свойство «SingleInstace», которое определяет другие экземпляры и позволяет запускать только один экземпляр.

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