Saltar al contenido

Cómo comprobar si se está ejecutando otra instancia de la aplicación

Solución:

¿Quieres un código serio? Aquí está.

var exists = System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1;

Esto funciona para cualquier aplicación (cualquier nombre) y se convertirá en true si hay otro instancia en ejecución de lo mismo solicitud.

Editar: para solucionar sus necesidades, puede utilizar cualquiera de estos:

if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) return;

de su método Main para salir del método … O

if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) System.Diagnostics.Process.GetCurrentProcess().Kill();

que matará al instante el proceso de carga actual.


Necesita agregar una referencia a System.Core.dll Para el .Count() método de extensión. Alternativamente, puede utilizar el .Length propiedad.

No está seguro de lo que quiere decir con ‘el programa’, pero si desea limitar su aplicación a una instancia, puede usar un Mutex para asegurarse de que su aplicación no se esté ejecutando.

[STAThread]
static void Main()
{
    Mutex mutex = new System.Threading.Mutex(false, "MyUniqueMutexName");
    try
    {
        if (mutex.WaitOne(0, false))
        {
            // Run the application
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
        else
        {
            MessageBox.Show("An instance of the application is already running.");
        }
    }
    finally
    {
        if (mutex != null)
        {
            mutex.Close();
            mutex = null;
        }
    }
}

Aquí hay algunas buenas aplicaciones de muestra. A continuación se muestra una forma posible.

public static Process RunningInstance() 
{ 
    Process current = Process.GetCurrentProcess(); 
    Process[] processes = Process.GetProcessesByName (current.ProcessName); 

    //Loop through the running processes in with the same name 
    foreach (Process process in processes) 
    { 
        //Ignore the current process 
        if (process.Id != current.Id) 
        { 
            //Make sure that the process is running from the exe file. 
            if (Assembly.GetExecutingAssembly().Location.
                 Replace("https://foroayuda.es/", "\") == current.MainModule.FileName) 

            {  
                //Return the other process instance.  
                return process; 

            }  
        }  
    } 
    //No other instance was found, return null.  
    return null;  
}


if (MainForm.RunningInstance() != null)
{
    MessageBox.Show("Duplicate Instance");
    //TODO:
    //Your application logic for duplicate 
    //instances would go here.
}

Muchas otras formas posibles. Consulte los ejemplos para conocer las alternativas.

El primero.

Segundo.

El tercero

EDITAR 1: Acabo de ver su comentario de que tiene una aplicación de consola. Eso se discute en la segunda muestra.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *