12 Temmuz 2014 Cumartesi

ThreadPool Kullanımı c#

 var kac = 20;
    var toProcess = kac;

    var resetEvent = new ManualResetEvent(false);

    for (var i = 0; i < kac; i++)
    {
        new Thread(delegate()
        {
            Do_SomeWork(Parameter1, Parameter2, Parameter3);
            if (Interlocked.Decrement(ref toProcess) == 0) resetEvent.Set();
        }).Start();
    }

    resetEvent.WaitOne();



c# ThreadPool sınıfı arka planda bir çok görev veya iş yaparken kullanma yönünden faydalıdır. ThreadPool kullanımı sayesinde tüm thread ler yönetiliyor.
Biz , Thread havuzlarını kullanarak paralel olarak işleri işliyebiliyoruz ve genelikle server uygulamalarında kullanılıyorlar.
Threadpool sınıfı ile thread leri sınırlıyoruz.
Yığın işlemleri ( batch processing ) sahipseniz çoklu çekirdek mimarisini kullanabiliriz ve ayrıca ThreadPool sınıfını da kullanmalısınız.
.Net framework bize System.Threading kütüphanesini sağlıyor. İşte bu namespace içerisinde ThreadPool sınıfını içeriyor.
ThreadPool sınıfı static bir sınıftır. Bundan dolayı erişime direk olarak izin veriyor.
Çoklu işlemci bilgisayarlarda bir çok thread çalışabiliyor ama tüm işlemciler yoğun ise ThreadPool sınıfı sayesinde bir kuyruk içine yerleştirilir ve thread lerden biri işini bitirene kadar bekletilir. Daha sonra biten herhangi bir thread den sonra kuyruktaki thread görevini veya işini yapabilir.
uygulamadan gelen bir istek olduğunda ThreadPool sınıfı içerisinde bulunan bir thread o iş verilir. Her istek geldiğinde anlayacağınız ThreadPool sınıfı içerisindeki thread ler bakılır. İstek , ne zaman geleceği belli olmadığından süreç asenkron olarak işlenmektedir. Tabiki bunu ana thread ( primary thread ) i meşgul etmeden yapmaktadır.
Kısa ömürlü thread ler için ThreadPool kullanın bir de ek bilgi olarak BackgroundWorker da kullanabilir. BackgroundWorker özellikle Windows Form uygulamalarında kullanılmaktadır.
ThreadPool sınıfına ait QueueUserWorkItem metotu ile thread üzerinde çalışmasını istediğin metotlarını bağlayabilirsin.
Yukarıdaki kod delegate deki kullanıma benzerdir. QueueUserWorkItem metotu içerisinde new WaitCallback içerisinde OtherFuction() metodunu thread üzerinde çalıştırıyor ve ayrıca parametre de gönderiyor. Object olan yer yani temp bir sınfı buraya parametre olarak gönderebilirsiniz. Burası çok önemlidir.
Şimdi bununla ilgili örenğimizi yapalım konsol uygulaması açın ve MyClass adında bir sınıf ekleyin. Aşağıdaki kodu ekleyelim.
Main Class ına aşağıdaki kodu ekleyelim.
Kodun Çıktısı :

Hiç yorum yok:

Yorum Gönder