I'm using this code to prevent a second instance of my program from running at the same time, is it safe?
Mutex appSingleton = new System.Threading.Mutex(false, "MyAppSingleInstnceMutx");
if (appSingleton.WaitOne(0, false)) {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
appSingleton.Close();
} else {
MessageBox.Show("Sorry, only one instance of MyApp is allowed.");
}
I'm worried that if something throws an exception and the app crashes that the Mutex will still be held. Is that true?
It is more usual and convenient to use Windows events for this purpose. E.g.
static EventWaitHandle s_event ;
bool created ;
s_event = new EventWaitHandle (false,
EventResetMode.ManualReset, "my program#startup", out created) ;
if (created) Launch () ;
else Exit () ;
When your process exits or terminates, Windows will close the event for you, and destroy it if no open handles remain.
Added: to manage sessions, use Local\
and Global\
prefixes for the event (or mutex) name. If your application is per-user, just append a suitably mangled logged-on user's name to the event name.