Bu yazımızda WPF uygulamalarımızı single instance hale nasıl getirebileceğimizden bahsediyor olacağım. Single instance uygulama demek, uygulamamızın sadece bir örneğinin çalıştırılabilmesi anlamına gelir. Örneğin windows işletim sisteminde hesap makinesini ya da paint uygulamasını birden fazla açabilir ve her birinde farklı işlemler yapabilirsiniz. Çünkü her bir uygulama farklı bir prosestir ve farklı thread lerde çalışırlar. Bu da bize her birinde bağımsız olarak farklı işler yapmamıza olanak sağlar.

image

Uygulamamamızın tek bir örneğinin çalışmasını sağlamak için pek çok yöntem bulabilirsiniz. Bunlardan biri uygulama ilk çalıştığında sistemdeki tüm proseslerin listesini alıp kendisiyle aynı isimli process olup olmadığını kontrol etmektir. Eğer aynı isimli proses yoksa uygulamayı çalıştırmak varsa o anki uygulamadan çıkmaktır. Aslında mantıklı bir çözüm gibi gelse de şöyle bir senaryonun oluşma durumu da var. Ya uygulamamızla aynı ismi taşıyan farklı bir uygulama varsa? İşte bu yüzden bu seçenek pek sağlıklı durmuyor. Diğer bir seçenek de Mutex kullanmaktır.İki ya da daha fazla thread aynı anda, paylaşılmış bir kaynağa erişmeye çalıştığında, sistemin kaynağı aynı anda sadece bir thread in kullanmasını garanti etmesi gereken bir senkronizasyon mekanizmasına ihtiyacı vardır. Bu noktada Mutex ler devreye girmektedir. İlk thread in mutex’i devradlığını düşünelim, diğer threadler ilk thread mutex’i serberst bırakana kadar askıya alınırlar. Bu kadar teknik bilgiden sonra artık uygulamaya geçmenin zamanı:)

WPF uygulamaların böyle bir yapıyı kullanmak için öncelikle uygulama başlarken bu kontrolün yapılması gerekmektedir. Bu yüzden gerekli kontrolü kend Main metodumuzda yapmalıyız. WPF de main metodumuz otomatik olarak oluşturulur. Oluşturulan metodu görmek için Visual Studio Solution penceresinden Show All Files dediğimizde obj klasörünün içinde bulunan App.g.cs dosyasında bulabilirsiniz. Uygulamayı kendi main metodumuzdan çağırmak için şu yolu izlemeliyiz:

1-İlk olarak App.xaml dosyasının özelliklerinden Application Definition olan build action ını Page olarak değiştirmeliyiz.

2.Kendi tanımladığımız Main metodunu “single-threaded apartment” olarak işaretlemeliyiz. Artık kontrollerimizi yapabiliriz. Aşağıdaki kod parçası amacımıza ulaşmak için yeterli olacaktır.

public static bool isFirstInstance=false;

        [STAThread]
        public static void Main()
        {            
            using (var mutex=new Mutex(true,"WPFSingleInstanceDemo",out isFirstInstance))
            {
                if (isFirstInstance)
                {
                    MainWindow window = new MainWindow();
                    window.ShowDialog();
                }
                else
                {
                    MessageBox.Show("Uygulama zaten çalışıyor!");
                    App.Current.Shutdown();
                }
            }
        }

Yukarıda görüldüğü gibi bir mutex nesnesi oluşturuyoruz. Yapıcı metoduna gönderdiğimiz ilk parametre ile bu mutex i uygulamamızın çalışacağı thread ile ilişkilendiriyoruz, ikinci parametremizde ise mutex in adını belirtiyoruz . Son olarak da eğer daha önce bu isimde mutex yoksa oluşturulduğunu belirtmek için true varsa false değeri döndürdüğünü belirten sonucu almamız için bir değişken veriyoruz. Değişkenin durumuna göre de uygulamanın çalışmasını yönlendirebilirsiniz.

Son olarak hatırlatmakta yarar var. Aynı yapıyı wpf uygulamalarının yanısıra winform uygulamalarında da kullanabilmek mümkün.

SingleInstanceDemo.zip (24,42 kb)

About the Author