Pregunta

Bien, he creado mi aplicación c #, he creado un instalador para ella y la tengo instalada en mi máquina.

El problema es que cuando el usuario abre la aplicación dos veces, habrá dos instancias de la aplicación ejecutándose. Solo quiero que una instancia de la aplicación se ejecute en cualquier momento, ¿cómo hago para hacer esto?

Gracias por tu ayuda,

¿Fue útil?

Solución

La técnica común para esto es crear un Mutex llamado y verificar su presencia en el inicio de la aplicación.

Consulte esto o this .

Código de DDJ:

class App : Form
{
    Mutex mutex;

    App()
    {
        Text = "Single Instance!";
        mutex = new Mutex(false, "SINGLE_INSTANCE_MUTEX");
        if (!mutex.WaitOne(0, false)) 
        {
            mutex.Close();
            mutex = null;
        }
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
            mutex.ReleaseMutex();
        base.Dispose(disposing);
    }

    static void Main()
    {
        App app = new App();
        if (app.mutex != null) Application.Run(app);
        else MessageBox.Show("Instance already running");
    }
}

Otros consejos

Resolví este problema por este

[STAThread]
 static void Main()
    {

        Process[] result = Process.GetProcessesByName("ApplicationName");
        if (result.Length > 1)
        {
            MessageBox.Show("There is already a instance running.", "Information");
            System.Environment.Exit(0);
        }
        // here normal start 
    }

es simple, pero apenas tuve tiempo de buscar mejores soluciones.

Gracias a Messrs. Allen y Powell :

    static void Main() 
    {
        using (Mutex mutex = new Mutex(false, @"Global\" + appGuid)) {
            if (!mutex.WaitOne(0, false)) {
                string processName = GetProcessName();
                BringOldInstanceToFront(processName);
            }
            else {
                GC.Collect();
                Application.Run(new Voting());
            }
        }
    }

    private static void BringOldInstanceToFront(string processName) {
        Process[] RunningProcesses = Process.GetProcessesByName(processName);
        if (RunningProcesses.Length > 0) {
            Process runningProcess = RunningProcesses[0];
            if (runningProcess != null) {
                IntPtr mainWindowHandle = runningProcess.MainWindowHandle;
                NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_SHOWMINIMIZED);
            NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_RESTORE);
            }
        }
    }

No conozco el entorno en el que está operando, pero hay que tener en cuenta las "aplicaciones de instancia única": cómo define una instancia única. Si la aplicación se puede ejecutar en varias estaciones de trabajo al mismo tiempo, utilizando un origen de datos común, ¿es eso un problema? Del mismo modo, ¿qué pasa con una situación de servicios de terminal (o una situación de " ejecutar como ") donde más de un usuario inicia sesión en la misma computadora, desea restringir la aplicación de tal manera que solo una instancia por usuario, por computadora? ¿O está de acuerdo con que simplemente sea una instancia por usuario?

La respuesta a estas podría llevarte en una dirección sobre otra. Por ejemplo, tenemos una aplicación de 'instancia única' con el alcance siendo un grupo de computadoras. Solo se permite un usuario dentro de ese grupo de estaciones de trabajo. Esto lo logramos teniendo una tabla en nuestra fuente de datos compartida que rastreaba a los usuarios conectados actualmente. Este es un problema de mantenimiento, ya que necesita estar seguro de que la tabla es 100% precisa todo el tiempo. Manejar cosas como cortes de energía inesperados en la estación de trabajo, dejando a " bogus " los registros en esa tabla tuvieron un manejo cuidadoso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top