Garantizar solo una instancia de aplicación

Posible duplicado:
¿Cuál es la forma correcta de crear una aplicación de instancia única?

Tengo una aplicación de Winforms, que inicia una pantalla de inicio mediante el siguiente código:

Hide(); bool done = false; // Below is a closure which will work with outer variables. ThreadPool.QueueUserWorkItem(x => { using (var splashForm = new SplashScreen()) { splashForm.Show(); while (!done) Application.DoEvents(); splashForm.Close(); } }); Thread.Sleep(3000); done = true; 

Lo anterior está en el código subyacente de la forma principal y se llama desde el controlador de eventos de carga.

Sin embargo, ¿cómo puedo asegurarme de que solo se cargue una instancia de la aplicación a la vez? En el controlador de eventos de carga del formulario principal, podría verificar si la lista de procesos está en el sistema (a través de GetProcessesByName (…)), pero ¿hay algún método mejor?

Usando .NET 3.5.

GetProcessesByName es una forma lenta de comprobar si se está ejecutando otra instancia. El método más rápido y elegante es usar mutex:

 [STAThread] static void Main() { bool result; var mutex = new System.Threading.Mutex(true, "UniqueAppId", out result); if (!result) { MessageBox.Show("Another instance is already running."); return; } Application.Run(new Form1()); GC.KeepAlive(mutex); // mutex shouldn't be released - important line } 

Tenga también en cuenta que el código que presentó no es el mejor enfoque. Como se informó en uno de los comentarios que llaman DoEvents () en un bucle no es la mejor idea.

 static class Program { // Mutex can be made static so that GC doesn't recycle // same effect with GC.KeepAlive(mutex) at the end of main static Mutex mutex = new Mutex(false, "some-unique-id"); [STAThread] static void Main() { // if you like to wait a few seconds in case that the instance is just // shutting down if (!mutex.WaitOne(TimeSpan.FromSeconds(2), false)) { MessageBox.Show("Application already started!", "", MessageBoxButtons.OK); return; } try { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } finally { mutex.ReleaseMutex(); } // I find this more explicit } } 

Una nota sobre el id único, esto debe ser único en la máquina, así que use algo como el nombre de su empresa / nombre de la aplicación.

Editar:

http://sanity-free.org/143/csharp_dotnet_single_instance_application.html