Merhabalar ;

Framework 4.0 ile gelen Paralel programlamanın konuşulduğu bu günlerde eski bilgileri tazelemek adına multithreading hakkında birşeyler karalamak istedim ve bu yazıya öncelikli olarak çok kanallı uygulamanın ne anlama geldiğini açıklayarak başlamak istiyorum Smile günümüzde kullanılmakta olan tek işlemcili bilgisayarlarlar , bilgisayarımız üzerinde "aynı anda" birçok işlemi yaptıgımızı "sanmamıza" olanak tanırlar Laughing evet sanmamıza. çünkü tek işlemcili bir bilgisayarda birim zamanda sadece tek işlem gerçekleşir.Yani , windows media player ile müzik dinlerken aynı anda internet explorer ı çalıştırmayız veya aynı anda film açıp izleyemeyiz. Sadece bunu yapabildiğimizi sanırız.Aslına bakarsanız , işlemci bu çalıştırdıgımız uygulamaların herbiri için birer thread açar ve eğer siz bir Windows işletim sistemi kullanıyor iseniz 20 milisaniye süre aralıkları ile bütün bu thread leri teker teker gezer ve belirlenmiş önem durumlarına göre onları teker teker çalıştırır ancak bu çalıştırma süresi insanın gözle algılayamayacağı bir hızda gerçekleştiği için biz bu işlemler birlikte oluyor sanarız..Wow.  Cool ben teknoloji diye buna derim Tongue out O zaman işin hikaye kısmı ile daha fazla uğraşmadan c# da thread yapısını nasıl kullanacağımıza bakalım ve bunun için Klasik bir windows forms uygulaması açalım;

Biz uygulamamızı çalıştırdığımız zaman bildiğimiz gibi öncelikle static Main methodu çalışır ve bu methodla beraber uygulamamıza ait thread başlamış olur.Ve eğer biz çok kanallı bir uygulama geliştirme gerekliliği duymaz ve bunu kullanmassak yapacağımız bütün işlemler bu başlangıç thread ine bağlıdır.Ve uygulamamız çalıştıgında Form1 bileşeninin Application.Run() ile çalıştırıldığını düşünelim.Bu uygulamamızın ana form'udur ve uygulamaya ait thread bu forma bağlıdır.Siz eğer uygulamanızda 5 tane bu Main form'a bağlı form yarattı iseniz ana formu kapattıgınız anda diğer bütün form larda iptal olacaktır.Deneyerek görebilirsiniz ;

ancak diyelim ki sizin birbirinden bağımsız yani birbirine paralel olarak çalışan form lar yaratmanız gerekiyor.Veya daha güzel bir şekilde durumu özetlersek , uygulamaya ait ana thread dan bağımsız thread ler yaratmanız gerekiyor.Öyleyse yaratalım ve ilk işlem olarak uygulamamıza System.Threading namespace ini ekleyelim ve 3 tane method yazalım.Method yazmamızın sebebi thread kullanmak için bu methodları birer delegeye bağlayacak olmamızdan kaynaklanmaktadır.Öyleyse "parametre almayan" ve geriye değer döndürmeyen , tek işi form yaratmak olan methodlarımızı yazalım.

şimdi ise thread yapısını kullanalım ;

kodu inceleyecek olursak önce formun kurucu methodu içerisinde CheckForIllegalCrossThreadCalls = false diyerek uygulamanın varsayılan olarak thread kullanımının güvenlik nedeni ile kapalı olması durumunu disable ettik.Ondan sonra threadStart delegesine "parametresiz" methodumuzu ve thread class ınada bu delegeyi verdik ve thread i start ettik.Sonra her 3 method içinde aynı işlemi tekrarladık. böylece birbirine paralel olarak çalışan 4 farklı işlemimiz oldu.Deneyerek test edebilirsiniz.

 İşlemimiz start oldu demişken tam bu noktada thread sınıfına bağlı olan birkaç methoddan bahsetmek istiyorum bunlar Suspend , Resume ve Abort isimli methodlar.Aslında isimlerinden bile ne işe yaradıkları anlaşılıyor ancak söylememiz gerekirse Suspend çalışan thread i durduruyor , Resume kaldığı yerden devam ettiriyor , Abort ise thread i sonlandırıyor.Bunun dışında isAlive isminde de çok önemli bir methodu var bu class ın. bu method çok önemli çünkü Thread çalışırken formu kapatmaya çalıştıgınızda uygulama hata verecektir.Sizde form kapatırlırken , kapatılmamış veya görevi sonlanmamış thread var mı diyerek kontrol edip , eğer var ise Lütfen bekleyiniz işlem devam ediyor tadında bir uyarı mesajı verebilirsiniz.

 Thread lerle parametreli methodların nasıl kullanıldıgını göstermeden önce bahsetmek istediğim bir başka önemli noktada thread lerdeki öncelik sıralaması.Yazının başındada belirttiğim gibi thread ler belirli bir sıraya konulup bu sıraya göre çalışırlar ve siz bir önem derecesi belirtmesseniz hepsinin önem derecesi Normal olarak algılanır.Ancak siz thread lerin Priority property sine ThreadPriority enum sabiti ile set işlemi yaparak öncelik belirtirseniz sıralama bu önceliğe göre yapılır.

Peki ya methodumuzda parametre olmasını istersek , o zaman ne yapacağız ??

Tek yapmamız gereken ThreadStart delegesi yerine patametizedThreadStart delegesini kullanmak ve parametreye değeride thread'in start methodu üzerinden atamak.Burada ki önemli noktalardan biri methodun parametresindeki değişkenin tipi Object olmak zorunda.

Umarım birileri için faydalı olmuştur.Başka yazılarda görüşmek üzere.