C# ile Multi Thread Çalışma — Çok Kanallı Çalışma

8
Want create site? Find Free WordPress Themes and plugins.

Herkese merhabalar. Bu yazıda sizlere C# ile nasıl multi Thread çalışmayı anlatacağım. İlk olarak Multi Thread ne demektir onu anlatacağım.

Multi thread çok kanallı çalışma anlamına gelir. yani yapılacak olan bir işlemi parçalara bölüp aynı anda kaç parçaya böldüysek yapmaktır. İşçi havuz problemlerindeki gibi bir işi tek bir işçi yapacağına birden fazla işçinin yapmasını sağlayacağız.

Bu şekilde işlemlerimiz iki kat üç kat hızlanacaktır. Çünkü birden fazla işlem parrçacığı ile işlem yapmış olacağız.

Bu işlem için programımıza ilk olarak Thread kütüphanesini eklememiz gerekmektedir.


Yukarıdaki kütüphaneleri ekledikten sonra kodlama kısmına geçebiliriz.

İlk olarak thread ile çalışacak fonksiyonlarımızı belirtmeliyiz. Yani thread çalıştırıldığında hangi fonksiyonumuz çalışacak bunu hazırlamamız gerekmektedir.


Yukarıdaki gibi üç tane fonksiyon hazırladık ve ve bu fonksiyonları ayrı ayrı thread lar ile çağıracağız ve çıktılara bakacağız. Program çıktısından threadların işlemi yapma şekline bakacağız.

Şimdi Threadların nasıl çalıştırıldığına bakalım…


Yukarıdaki kod bloğunda ise Threadlarımızı oluşturduk ve başlattık. Gördüğümüz gibi threadlarımız oluşturduk ve içerisinde hangi fonksiyonun çalışacağını belirledik

Bu şekilde fonksiyonu thread üzerine bindirdik ve çalıştırdık.

Program çıktısı aşağıdaki şekilde olacaktır. Bu bende bu şekilde çıktı siz denerken başka şekilde çıkabilir. Çünkü Threat sisteminin çalışma sistemine göre farklılılar gösterir.


Gerisi getirmedim. Gördüğünüz gibi threatların çalışma sırasına göre farklı Çıktılar alabiliyoruz.

Peki Threadların içerisinde aynı fonksiyonu çalıştıramazmıyız.

Tabiikide çalıştırabiliriz. Farklı Threadlar içerisinde aynı fonksiyonu çalıştırabiliriz.Aşağıda bununla ilgili bir örnek yapalım.


Yukarıdaki kon bloğunda gördüğümüz üzere aynı fonksiyonu üç farklı thread ile üç defa çalıştırmış olduk. Bu şekilde fonksiyonun yapacağı toplam işi üçe bölerek yaptırmış olduk ve işlemi daha hızlı bir şekilde yaptırmış olduk. Programın çıktısı yine önceki örneğin çıktısına benzer olacaktır.

Birde dikkat edersek fonksiyonun içerisine değişken değeri göndermeden bu işlemi yaptık. Ama atıyorum 300.000 tane değişken değeri olacak olan bir sonuç almak istiyoruz. Peki bunu nasıl yapacağız. Yukarıdaki şekilde dikkat edin değişkenlerimizi Thread ile fonksiyona gönderemiyoruz.

Aşağıda yazacağımız fonksiyon örneği ile fonksiyon içerisine değişken göndererek çalıştıralım.


Yukarıdaki örnekte fonksiyon içerisine değişken gönderdir. Değişken göndererek çalışmasını sağladık.

Programın çıktısı ise yaklaşık olarak aşağıdaki şekilde olacaktır.


Yukarıdaki programın çıktısının geri kalanını yazmadım ama aşağı yukarı bu şekilde çıkacaktır.

Birde farklı bir yöntem olarak delegate nesnelerini kullanarak başlatma var. Yani kodlarımızı bir delegate ye eşitliyoruz ve o şekilde çalıştırıyoruz Aşağıda ise bunun ile ilgili bir örnek verdim onuda inceleyelim


Eğer isterseniz şimdi son bir örnek yapalım ve yazımızı bitirelim.

Şimdi girilen bir sayıya kadar olan çift sayıları bulduran bir programı multi thread mantığı ile yapalım.


Yukarıda thread_sayisi ile sayıları biner biner kontrol ettireceğiz kaç tane sayı giriyorsa onu 1000 sayısına bölecek ve işlemi o kadar thread ile yaptıracak.

For döngüsü içerisinde yukarıdaki gibi fonksiyonlarıda yazabiliriz.

Göründüğü gibi for döngüsü içerisinde istediğimiz kadar thread oluşturduk ve başlattık. Bu şekilde işlem hızını kulanıcının girdiği değere göre yaptırdık. Bu şekildede normal olarak yaptığımızda 10 saniyede bitecekse işlem 2 , 3 saniyeye kadar indirdik.

Son olarak şunuda ekleyerek yazımızı bitirelim

Bir elin nesi var iki elin sesi var mantığı ile Multi Thread kulanımı programlarımızda ağır işlemler için çok büyük hız kazanmamıza yardımcı olacaktır. Çünkü aynı işlemi birden çok işçiye yaptırmış oluyoruz.

Bu yazımızda bu kadar — Takipte Kalın
İyi Çalışmalar
Burak Hamdi Tufan

Did you find apk for android? You can find new Free Android Games and apps.
0%
0%
Awesome
Share.

About Author

Ben Kocaeli üniversitesi Uçak Elektrik Elektronik Bölümü Okuyorum. Bununla Birlikte 9 Yıldır yazılımcılık Yapıyorum. 12 Farklı Dilde ve 6 Farklı Platformda Profesyonel Yazılımlar Geliştirebiliyorum. Yazılım Benim için Hobi Değil Yasaşm Tarzıdır. Bu işten Para Kazanmak Değil Zevk Almak İçin Yapıyorum. Bu yüzden yazılım dünyasından ayrılmak istemiyorum.

8 yorum

  1. MUSTAFA BÜKÜLMEZ on

    Selamlar,
    Çok sadece ve güzel anlatmışsınız bunu için çok teşekkür ederim.
    Size bir sorum olacaktı bu konu ile ilgili olarak.
    Şuanda yürüttüğüm bir asp.net web projem var ve işlemlerin %80 sql üzerinden çalışıyor.
    Sayfalarda hep fonksiyonlarım var onların içlerinde başka fonksiyonlar (sql fonksiyonları)
    bu sebepten dolayı özellikle bir sayfamdaki devexress grid çok yavaş geliyor.
    İlgili fonksiyonu sqlde çalıştırdığımda veri 2-3 saniyede geliyor fakat gride doldururken sayfanın açılması 15 20 saniyeyi buluyor. Şuan maksimum 3 kişi ile aynı anda test ettim. 3 kişi aynı anda sayfaya tıkladığında sayfa bile açılmıyor. Olur mu bilmiyorum fakat bu thread’ları asp.net te de gridviewin hızlı doldurulması için kullanabilir miyiz?
    Kullanabilmemiz mümkünse nasıl kullanabiliriz?

    • Evet kullanılabilir Fakat sitenizdeki veritabanı kodları SQL den gelirken tabloları dolduruyorken onu tek bir fonksiyon ile yapar. ama atıyorum tablonun yarısını bir fonksiyon diğer yarısını bir fonksiyon ile doldurmayı düşünüyorsanız olabilir.

      Sitelerinizdeki sql işlemleri için benim önerim Linq To Sql Kullanımıdır. Tablo doldurma ekleme silme gibi işlemler çok hızlı ilerler.
      Ayrıca sorgunuzun dönmesi nasıl çalıştığınada bağlıdır. yani gereksiz değişkenler gönderiyorsanız veya çekiyorsanız yine yavaş gelir.

      Birde yavaşlığın sebebi hosting sağlayıcınızda olabilir.

      İyi çalışmalar dilerim

      • MUSTAFA BÜKÜLMEZ on

        Şu şekilde açıklayayım…
        Proje, proje sahibinin serverinde barınmakta. ve maksimum 50 kullanıcısı olacak.
        SQL serverde yine aynı serverde yani site de veritabanında aynı serverde barınmakta.
        Sorgu sayfa yüklenirken çekiliyor ve 2 tane where şartı bulunuyor. O parametreleride session’dan çekiyorum örneğin Session[“kullanici_adi”].ToString() ve Convert.ToInt32(Session[“kullanici_kodu”].ToString()) şeklindedir.

        proje büyük ölçüde bitti ama performans sıkıntıları var.
        Yukarıdaki açıklamaya göre yine Linq to SQL önerirsiniz yoksa Thread ile bu işi çözebilir miyiz?.

        • thread ile çözüleceğini sanmıyorum çünkü tek bir sorgunun çalışması gerekiyor. Thread ise birden fazla sorgunun çalışmasında işe yarar.

          Yani burda thread işinize yaramaz. ve sorgu bu kadar basit bir sorgu ise server dan kaynaklı bir sorun diyeceğim tabii diğer parametreleride gözden geçirmek gerekiyor

Leave A Reply