Makale Özeti

Bazen uygulamarımızda bol işlemli ve diğer fonksiyonlar ile bağlantılı fonksiyonlar kullanırız. Örnek verecek olursak diyelimki kayıt sayısı 100000 lara ulaşan bir db ye kayıt ekleme işlemimiz var. ve bunları aynı anda fonksiyon içinde basıyoruz. tabi bu uzun sürebilecek işlemi genellikle Thread methoduna bağlarız. Thread altta verdiğimiz verileri db ye eklemekle meşgulken mâlüm uygulama kullanıcısı beklemek zorunda kalır. Ama biz programcılar kullanıcıların bu bekleme olaylarından hoşlanmadığını ve yapmak istedikleri işlemleri hiç beklemeden devam ettirmekten hoşlandığını biliriz ve buna uygun uygulamalar yapmaya çalışırız. LOCK yöntemi aslında bu bekletme olayı ile ilgili değil. Yani uygulamamıza herhangi bir hız katkısı sağlamamaktadır. kısaca LOCK 'u anlatmak istersek belli bir işlemin yapılması aşamasında diğer işlemlerin o an diğer fonksiyonlarda yapılan işlemler ile çakışmaması için bir sıraya sokturma yönetemi gibi tanımlanabilir.

Makale

Merhaba arkadaşlar...

Bu makalemde LOCK yönetemini bilgim ve dilimin döndüğü doğrultuda anlatmaya çalışacağım. Öncelikle Neden LOCK? sorusunu cevaplayalım.

Bazen uygulamarımızda bol işlemli ve diğer fonksiyonlar ile bağlantılı fonksiyonlar kullanırız. Örnek verecek olursak diyelimki kayıt sayısı 100000 lara ulaşan bir db ye kayıt ekleme işlemimiz var. ve bunları aynı anda fonksiyon içinde basıyoruz. tabi bu uzun sürebilecek işlemi genellikle Thread methoduna bağlarız. Thread altta verdiğimiz verileri db ye eklemekle meşgulken mâlüm uygulama kullanıcısı beklemek zorunda kalır. Ama biz programcılar kullanıcıların bu bekleme olaylarından hoşlanmadığını ve yapmak istedikleri işlemleri hiç beklemeden devam ettirmekten hoşlandığını biliriz ve buna uygun uygulamalar yapmaya çalışırız. LOCK yöntemi aslında bu bekletme olayı ile ilgili değil. Yani uygulamamıza herhangi bir hız katkısı sağlamamaktadır. kısaca LOCK 'u anlatmak istersek belli bir işlemin yapılması aşamasında diğer işlemlerin o an diğer fonksiyonlarda yapılan işlemler ile çakışmaması için bir sıraya sokturma yönetemi gibi tanımlanabilir.

Aşağıdaki örnekte basit bir örnek yapmaya çalıştım. Aşağıdaki uygulamanın çalışma şekli bir console uygulamasında kullanıcıdan alınan sayı değeri kadar GenericList'e veri basılma işlemidir. Ve bu veri ekleme işlemi thread'a bağlanmış durumda. kullanıcının verdiği yüksek basamaklı bir rakam ile thread ın hemen sonuç vermesi gecikecektir. thread altta verileri eklerken kullanıcıdan 2 bir rakam istenir. Ve bu rakam verilen eklendiği GenericList'in index numarası olacaktır. ve daha thread altta kullanıcının ilk verdiği rakam'a ulaşmadan kullanıcının verdiği Index numarası GenericList'ten silinemeyeceği için hata verecektir.


 

class OrnekSinif

    {

        private Object Kilit = new Object();

 

        List<string> GenelList = new List<string>();

        int BasilacakDegerSayisi = 0;

 

        public OrnekSinif(int _BasilacakDegerSayisi)

        {

            BasilacakDegerSayisi = _BasilacakDegerSayisi;

        }

 

        public void VerileriBas()

        {

            //Burada kullanılan LOCK yöntemi ile lock içindeki

            //işlemler bitinceye kadar diğer Kilit isimli LOCK lar dondurulmuş

            //olacaktır.

           lock (Kilit)

            {

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

                {

                    GenelList.Add(string.Format("{0}. Değer Yüklendi...", i));

                }               

           }

            Console.WriteLine("Değerler Yüklendi!");

        }

 

        public void VeriSil(int SilinecekVerininIndexNumarasi)

        {

            //kullanıcı eğer silinecek numarayı girerse ve eğer

            //Kilit isimli LOCK işlem için dondurulmuşsa burada beklemeye

            //alınacaktır. Diğer işlem bitimine kadar Lock içindeki kodlar çalışmayacaktır.

            lock (Kilit)

            {

                GenelList.RemoveAt(SilinecekVerininIndexNumarasi);

            }

            Console.WriteLine(GenelList.Count.ToString());

        }

    }

 

    class Test

    {

        static void Main()

        {

            //Kullanıcıdan İstediği GenericList Sayısı İstenir.

            //Not: Bilgisayarlarınızın Hızına Bağlı Olarak Bu Değeri Yüksek

            //Verirseniz Daha İyi Denemeler Yapabilirsiniz. Örneğin:500000 gibi

            Console.WriteLine("Lütfen Girilecek Değer Sayısını Yazınız: ");

            int GirilenDegerSayisi = Convert.ToInt32(Console.Read());

 

            //ilgili sınıfımızı Yaratıyoruz.

            OrnekSinif sinif = new OrnekSinif(GirilenDegerSayisi);

 

            //Thread'ı verileri basması için hazırlıyoruz.

            Thread t = new Thread(new ThreadStart(sinif.VerileriBas));

 

            //şimdide Thread ı çalıştırıyoruz ki Veriler List'e basılmaya başlasın

            t.Start();

 

            //thread arkada verileri basadursun o sırada bizde yine Silinmesini İstediğimiz

            //GenericList Index numarası istiyoruz.

            sinif.VeriSil(Convert.ToInt32(Console.ReadLine()));

 

 

            Console.ReadLine();

        }

    }

 

YukarıdakiUygulamada LOCK sisteme bildirildiği andan itibaren aynı LOCK ismine sahip diğer işlemler ilk çalışan LOCK bitinceye kadar beklemeye alınacaktır. böylelikle GenericList istenilen sayı kadar içine veri girildiği zaman LOCK (kilit) kalkacaktır ve diğer  LOCK'a toslayan işlemler kilit kalktığı için yoluna devam edecek ve kendi yapmaları gereken görevi yerine getirecektir.

Yukarıdaki örnekte umarım LOCK işlemini anlatabilmişimdir.

Birdahaki Makalemde Görüşmek Üzere Kolay Gelsin.