Ovo je jedan od veoma dobrih primjera koliko programiranje nekad može biti zanimljivo :)) Kao jedno od rješenja, može se upotrijebiti Mutex klasa.
Ovo se može uraditi ako pri svakom pokušaju pokretanja aplikacije provjerimo da li ima ijedna instanca iste aplikacije u sistemu (logično, naravno). Problem nastaje kako to realizirati. Treba nam neki način “signaliziranja”, način da drugim aplikacijama kažemo da je jedna instanca već pokrenuta.
Jednostavno rješenje nudi Mutex, koji predstavlja process-wide lock mehanizam u .NET-u (isto kao i lock – tj. Monitor.Enter() i Monitor.Exit() ). Registrovani Mutex objekat, pod nekim nazivom, je vidljiv u cjelom sistemu – i sve aplikacije mu mogu pristupiti. Ovo možemo iskoristiti tako da unutar Main() metode pri startanju aplikacije provjerimo da li ima Mutex pod istim nazivom već registrovan:
static class Program
{
// Mutex objekat pravimo statičnim da ga GC ne preuzme.
// Isto možemo postići da na kraju Main() metode pozovemo
// GC.KeepAlive(mutex)
static Mutex mutex = new Mutex(false, "nazivKompanije url bla bla");[STAThread]
static void Main()
{
// sačekati par sekundi u slučaju da se upravo gasi
// druga instanca
if (!mutex.WaitOne(TimeSpan.FromSeconds(2), false))
{
MessageBox.Show("Aplikacija je već " +
"pokrenuta!", "", MessageBoxButtons.OK);
return;
}
try
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
finally { mutex.ReleaseMutex(); }
}
}
Što se tiče samog nazivanja Mutex objekta, pokušajte staviti naziv za koji ćete biti sigurni da niti jedna druga aplikacija neće koristiti – obično string sastavljan od naziva aplikacije, naziva kompanije, url-a kompanije itd…

