Yazılımcının Günlüğü | YazilimGunlugu.Com
Arama
Makale Kategorileri
Üye Girişi
Şuanki online üyeler()
Aktif üye bulunmamaktadır.


Lock Ölümcül Kilitleme

Yazar: Sinan BARAN

Kategori: .NET Framework

Eklenme Tarihi: 08.08.2009 02:59:28

Lock nedir? Nerelerde kullanılır?

Merhaba arkadaşlar bu makalemizde Lock yapısından bahsedeceğiz.

Lock nedir? Nerelerde kullanılır? sorularına açıklık getirerek başlayalım.

Lock yapısını, çamaşır makinelerine benzeterek örnekleyecek olursak iki senaryo yaratabiliriz.

               Senaryo 1: Eski bir çamaşır makineniz var ve bu nedenle makinenizde hiçbir kontrol mekanizması yok. Çamaşırları çamaşır makinenize attınız ve çamaşırlarınız yıkanıyor. Daha sonra ev arkadaşınız bilinçsiz bir şekilde makinenin kapağını açıyor ve makinada yıkanan çamaşırlarla beraber deterjanlı su yerlere dökülüyor ancak; makine hala çalışmaya devam ediyor. Bu durumda hiç hoşnut olmayacağınız bir şekilde evinizi su basıyor ve çamaşırlarınız kirleniyor.

               Senaryo 2: Artık yeni nesil bir çamaşır makinesi aldınız. Çamaşırları çamaşır makinenize attınız ve yıkamayı başlattınız. Ev arkadaşınız tekrar makinanın kapağını açmaya çalışıyor ama açılmıyor çünkü; makinenin sürdürmekte olduğu bir işlem var ve bu işlem bitene kadar makine kapağı kilitli tutularak, kapağın işlem devam ederken açılması durumunda oluşabilecek aksaklıkların önüne geçiliyor. İşte biz buna ölümcül kilitleme adını veriyoruz.

Kilit sayesinde yürütmüş olduğumuz işlemi dış etkenlere karşı koruyarak işlemin sorunsuz devam etmesini sağlayabiliyoruz. Artık kilit yapısını teknik alanda da uygulayabiliriz.

Bir ListBox'a onbinlerce değer ekleneceğini düşünelim. Böyle bir değer ekleme işlemi tabi ki uzun bir süre alacaktır. Bu işlem devam ederken aynı anda ListBox'a eklenmiş değerlerden birini silmeye çalışmamız, yazılımımızda sorun yaratacak olabilir. Bu nedenle işlem devam ederken üzerinde hiçbir değişiklik yapılmaması için işlemi Kilit yapısı altında çalıştırıyoruz.

Şimdi hem Lock yapısı kullanılarak hem de kullanılmayarak yapılan örneklere göz atalım.

 


 

 

Form görüntümüz bu şekilde.

 

 

Düz mantık uygulama

 

        public partial class DuzMantik : Form

        {

        public DuzMantik()

        {

            InitializeComponent();

            //Thread Guvenligi Saglaniyor.

            Control.CheckForIllegalCrossThreadCalls = false;

        }

        Thread t;

        ThreadStart ts;

        void ListBoxDoldur()

        {

            for (int i = 0; i < 5000; i++)

            {

                listBox1.Items.Add(i);

                listBox1.Refresh();

            }

        }

        private void button1_Click(object sender, EventArgs e)

        {

            //Formun Kitlenmemesi adina ListBoxDoldur Methodunu Thread'lerle cagirdim

            ts = new ThreadStart(ListBoxDoldur);

            t = new Thread(ts);

            t.Start();

        }

        private void button3_Click(object sender, EventArgs e)

        {

            listBox1.Items.RemoveAt(listBox1.SelectedIndex);

            MessageBox.Show("Ne Yaptin işlem devam ederken işlem içerisinden kayit sildin?\n simdi yandin sen:)\nKorkma Suc senin degil suc silmene izin veren yazilimcida:)");

        }

        private void button2_Click(object sender, EventArgs e)

        {

            t.Suspend()

 

 } 

Bu uygulamada Button1 ile ListBox'a Thread aracılığıyla değer ekleme işlemi gerçekleştiriliyor. İşlem devam ederken Button3 ile ListBox içerisindeki verileri silebiliyorum. Bu tıpkı çamaşır makinemiz çalışırken kapağını açmamız gibi bize ileride sorun yaratacak olabilir. Bu nedenle kontrol edilmesi gereken bir davranış. Bunun için şimdi Lock yapısının kullanıldığı örneği inceleyelim.

 

LOCK ile kullanımı 

         public partial class LockUygulanmis : Form

     {

        public LockUygulanmis()

        {

            InitializeComponent();

            Control.CheckForIllegalCrossThreadCalls = false;

        }

 

        Thread t;

        ThreadStart ts;

        private object KaleKilit = new object();

        void ListBoxDoldur()

        {

            lock (KaleKilit)

            {

                for (int i = 0; i < 5000; i++)

                {

                    listBox1.Items.Add(i);

                    listBox1.Refresh();

                }

            }

        }

        void Sil()

        {

            MessageBox.Show("Kayit Silmek istiyorsan Islemin Bitmesini Beklemelisin...");

            lock (KaleKilit)

            {

                listBox1.Items.RemoveAt(listBox1.SelectedIndex);

                MessageBox.Show("Silmek istedigin Kayit silinmistir.(İşlem Bitti Cunku))");

            }

        }

        private void button1_Click(object sender, EventArgs e)

        {

            ts = new ThreadStart(ListBoxDoldur);

            t = new Thread(ts);

            t.Start();

        }

        private void button2_Click(object sender, EventArgs e)

        {

            t.Suspend();

        }

        private void button3_Click(object sender, EventArgs e)

        {

            ts = new ThreadStart(Sil);

            t = new Thread(ts);

            t.Start();

        }

    }

 

İşlem yapılmaya başladığı zaman KaleKilit objesine işlemin başladığına dair bilgi veriliyor. Sonrasında bu işlemi etkileyecek herhangi bir işlem yapılmak istendiğinde Lock yapısının kullanıldığı KaleKilit objesi kontrol ediliyor ve eğer işlem yapı tarafından kilitliyse, işleme yapılmak istenen müdahele engelleniyor.

Lock yapısı bu kadar basit ve zevkli :) . Uygulamanın kaynak kodlarını aşağıdaki linkten indirebilirsiniz.

 

sinan.baran@bilgeadam.com

www.sinanbaran.com

OlumculKilit(Lock).rar (46,92 kb)

Yazar Hakkında 1 Yorum Yorum Yaz Yazara ait diğer Makaleler
Tema
Anket
ASP.NET MVC'yi Projeleriniz de kullandınız mı?


En Çok Okunan Makaleler
En Son Eklenen Makaleler
Soru Merkezinde Bekleyenler
Ana Sayfa | Hakkımızda | Editörler | Yazarlar | RSS RSS | İletişim
Yazılım Günlüğü 2007-2009 © Tüm Hakları Saklıdır.