предотвратить запуск приложения ac # более чем одним экземпляром - PullRequest
6 голосов
/ 23 августа 2010

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

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

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

Ответы [ 7 ]

10 голосов
/ 23 августа 2010

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

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 ctor указывает ему создать системный мьютекс для этого потока. Если Mutex уже существует, он вернет false через 3-й параметр.

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

4 голосов
/ 23 августа 2010

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

Process[] lprcTestApp = Process.GetProcessesByName("TestApplication");
if (lprcTestApp.Length > 0)
{
      // The TestApplication is already running, don't run it again
}
2 голосов
/ 23 августа 2010

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

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

2 голосов
/ 23 августа 2010

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

0 голосов
/ 17 июля 2017

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

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

2-Call-метод processIsRunning () с именем Process из RunAlready.cs в Program.cs

Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Tirage.MainStand
{
static class Program
{

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        PublicClass.Class.RunAlready RunAPP = new PublicClass.Class.RunAlready();
        string outApp = RunAPP.processIsRunning("Tirage.MainStand");

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        MainStand_FrmLogin fLogin = new MainStand_FrmLogin();
        if (outApp.Length == 0)
        {

            if (fLogin.ShowDialog() == DialogResult.OK)
            {
                Application.Run(new MainStand_masterFrm());

            }
        }
        else MessageBox.Show( "Instance already running");

      }
    }
 }

класс RunAlready:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PublicClass.Class
{
  public  class RunAlready
    {
      public  string processIsRunning(string process)
        {
        string xdescription = "";
        System.Diagnostics.Process[] processes =
            System.Diagnostics.Process.GetProcessesByName(process);
        foreach (System.Diagnostics.Process proc in processes)
        {
            var iddd = System.Diagnostics.Process.GetCurrentProcess().Id;
            if (proc.Id != System.Diagnostics.Process.GetCurrentProcess().Id)
            {
                xdescription = "Application Run At time:" + proc.StartTime.ToString() + System.Environment.NewLine;
                xdescription += "Current physical memory : " + proc.WorkingSet64.ToString() + System.Environment.NewLine;
                xdescription += "Total processor time : " + proc.TotalProcessorTime.ToString() + System.Environment.NewLine;
                xdescription += "Virtual memory size : " +         proc.VirtualMemorySize64.ToString() + System.Environment.NewLine;
            }
        }


        return xdescription;
    }
}
}
0 голосов
/ 23 августа 2010

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

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

0 голосов
/ 23 августа 2010

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

Ура, Матиас

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