Bir uygulamayı aynı anda birden fazla çalıştırmamak

C#, VB.NET, ASP.NET Add comments

Bir .NET uygulamasının aynı anda sadece bir örneğini(single instance) çalıştırmak için birçok yöntem kullanılır. Burada bu yöntemlerden en çok kullanılan ve en hızlı olan mutex metodunu kullanımını örneklendireceğiz. Mutex(Mutual Exclusion) fonksiyonu, belli kaynakların yalnızca bir thread tarafından kullanılmasını sağlayan böylece processlerin birbirini engelleme sorununu ortadan kaldıran threading işleminde önemli rol oynayan bir işletim sistemi nesnesidir. Bir mutex’i, programların bir t zamanında sadece bir kere çalışmasını sağlamak amacıyla geliştirilmiş senkronizasyon tabanlı kilit yapısı olarak düşünebiliriz.

.NET Framework’te Mutex sınıfı, System.Threading kütüphanesi altında bulunmaktadır. Overload edilmiş bu sınıfın constructörü, en çok 3 parametreli haliyle kullanılır.

public Mutex(bool initiallyOwned, string name, out bool createdNew);

İlk parametre bool türünde olup bu mutexti sahiplenmek için kullanılır. İkinci parametrede, bu mutex’i tekilleştirmek için bir isim verilir. Üçüncü parametre, mutex’in başarılı ve başarısız sonucunu bildiren değeri tutmak için kullanılır.

using System;//STAThread
using System.Windows.Forms;//MessageBox,Application
using System.Threading;//Mutex

namespace WindowsApplication1
{
static class Program
{
    [STAThread]
    static void Main()
    {
        bool IlkOrnek;
        //Bir mutex nesnesi oluşturalım.
        Mutex Mtx = new Mutex(true, "MyOrnekMutex", out IlkOrnek);
        if (!IlkOrnek) {
            MessageBox.Show("Bu program, zaten çalışıyor.");
            return;
        }

        Application.Run(new Form1());

        GC.KeepAlive(Mtx);//Nesneyi kaldıralım.

    }//Main

}//Program
}//WindowsApplication1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim IlkOrnek As Boolean
    'Bir mutex nesnesi oluşturalım.
    Dim Mtx As Mutex = New Mutex(True, "MyOrnekMutex", IlkOrnek)
    If (Not IlkOrnek) Then
        MessageBox.Show("Bu program, zaten çalışıyor.")
        Application.Exit()
    End If

    GC.KeepAlive(Mtx) 'Nesneyi kaldıralım.
End Sub 'Form1_Load

Bu yöntem dışında System.Diagnostics.Process sınıfı kullanılarak makine üzerinde çalışan process tablosunda arama yapılarak ta bir program çalışırken tekrar çalıştırılması engellenebilir.

Leave a Reply

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Giriş