Merhaba bu yazımda C# ile multithread programlama nasıl yapılır biraz ondan bahsedeceğim. Bir önceki yazımda teorik bilgilerini aktardığım bu konuyla alakalı ikinci yazımda programlama için kullanılan bazı komutlara yer vereceğim. İlk yazımın devamı gibi olacağından olay örgüsünü bozmadan ilk başta onu inceledikten sonra bunu okumanızı tavsiye ediyorum.
En başta sisteme kütüphanemizi, kullanacağımız sınıfı tanımlayarak başlıyoruz,
- System.Threading.Thread;
Thread oluşturmak için thread sınıfında bir nesne tanımlamamız yeterli olacak,
- Thread thread_ornek1 = new Thread();
Threadı başlatmak için,
- thread_ornek1.Start();
Bazen kullanmadığımız threadları sistemde durdurmak köşeye kaldırmak isteriz yani çizelgeleme dışına çıkarmak isteriz. Bu işlemi yaptığımızda thread bir anda sistemden kaldırılmaz. Bunun sebebi asenkron bir yapıda çalışıyor olmasıdır. Bir threadın gerçek manada durdurulması için o threadın içinde çalışan fonksiyonun safe point dediğimiz güvenli bir noktaya gelmesi gerekir. Bu nokta genellikle garbage collector dediğimiz yapı ile halledilir. Garbage collector yapısını biraz açıklayalım.
Multitasking ve thread başlıklı yazımda process nedir bahsetmiştim. Kısaca process programların çalıştırıldıktan sonra RAM de ki halidir. Biz normalde bir obje oluşturduğumuzda bu yapı RAM de heap denilen bölgede bir referans ile tutulur.
Örneğin:
- string[] araba = new string[5]
adında bir dizi oluşturmuş olalım.
Bu dizi oluşturulurken ilk başta new operatörü RAM’e gider ve araba adında ki dizi için boş bir alan bulmaya çalışır ve eğer bulursa bulduğu adrese bu nesneyi yerleştirir. RAM de nesnenin tutulduğu kısım heap bölgedir. Diyelim ki yer bulamadı işte o zaman Garbage Collector adını verdiğimiz mekanizma RAM de heap bölgede ki gereksiz yer kaplayan, kullanılmayan değişkenleri siler ve RAM de yer açar. Daha sonra nesnemiz boş alana yerleştirilir.
Kısaca new operatörü ile heap bölgede boş yer varsa belleğe yerleştirdik eğer boş yer yoksa garbage collector mekanizması devreye girdi, uygun alanı ayarladı ve daha sonra belleğe yerleştirildi.
Bu yapıyıda kısaca açıkladıktan sonra durdurma için kullandığımız yapıyı yazabilirim.
- thread_ornek1.Abort();
Unutmamak gerekir ki Abort() ile köşeye kaldırdığımız thread nesnesini tekrardan Start() ile geri çağıramayız. Tekrardan threadı geri çağırıp kullanmamız gerekiyor ise,
- thread_ornek1.Suspend();
metodu ile threadı durdurup,
- thread_ornek1.Resume();
metodu ile de threadı tekrardan kaldığı yerden devam ettirebiliriz.
Yalnız burada önemli bir husus vardır ki oda şudur. Biz bir threadı bu metot ile durdurduğumuzda aslında bu threadın etkilediği farklı threadları da durdurmuş onları geçiktirmiş sistemi deadlock dediğimiz duruma sokmuş oluruz. Bu duruma dikkat etmeliyiz. Bir başka durdurma metot kavramımız ise
- thread_ornek1.Sleep();
Kullanarak içine yazdığımız değer milisaniye cinsinden threadı durdurur. Yani çizelgeme dışına çıkartır. Sleep ile durdururken dikkat etmemiz gerekir bu sistemler gerçek zamanlı bir sistem olmadığı için tekrardan thread çalışmayabilir.
- thread_ornek1.Sleep(new TimeSpan(o, 1, 1 ) );
Sleep metodunu TimeSpan ile de kullanabiliriz. Burada da sistemi 0 saat 1 dakika 1 saniye bekletmiş oluruz.
- thread_ornek1.Join();
Threadlarda kullandığımız bu metod ile bir thread sonlanmadan diğer threada geçisi engellemiş oluruz. Diğer bir değişle trafik polisi gibidir geçişlerin sıralın olmasını karışıklık yaşanmamasını sağlar.
- thread_ornek1.IsAlive();
Herhangi bir zamanda bu metotu çağırırsak bize o anda ilgili threadın aktiflik durumunu verir ve geriye TRUE yada FALSE bir değer döndürür.
- thread_ornek1.Priority = ThreadPriority.Lowest;
Bazen birden fazla thread çalıştırdığımızda birine öncelik vermek isteriz. İşte tam bu gibi durumlarda kullanmamız gereken metot budur. Priority nesnesi enumerasyon tipindedir. Bu enum tipinin içerisinde Highest, AboveNormal, Normal, BelowNormal, Lovest gibi seçenekler barındırır.
Bu yazımda C# dilinde genellikle kullanılan karşımıza çıkan C# komutlarını kısaca aktarmaya çalıştım. Bir sonra ki yazımda thread üzerine uygulamalı örnekler ile seriye devam edeceğim. Şimdilik iyi günler dilerim.
—————————————————————————————————–
Bu serinin ilk yazısında thread ve multithread kavramının üzerinde durmuştum. Bu yazımda ise C# dilinde thread için çoğunlukla kullanılan komutları kısaca anlatmıştım oldum. Serinin bir sonra ki ve son yazısında ise thread konusu üzerine uygulamalı örnekler yapıp seriyi noktalayacağım.
Sağlıklı günler dilerim.