Kavramlarla ASP.Net WEB API Nedir ? – Bölüm 2
0

Önceki makalemizde Asp.Net Web API hakkında temel kavramlara değinmiştik. Bu bölümde ise Asp.Net Web API mimarisinin neler içerdiği hakkında fikir sahibi olacak ve API’ de sıklıkla kullanılan yapılardan paralel programlama hakkında giriş seviyesinde bilgi edineceğiz.

Web API içerisinde sıklıkla kullanılan yapılardan bir tanesi de paralel programlama konseptleridir. Web API konusunu kavramlarla açıkladığımız makale serimizde paralel programlama ile ilgili olarak bilinmesi gereken basit iki ayrım noktasını da belirtmekte yarar görüyorum.

THREAD

Resim-1

Paralel programlama denince herkesin aklına eminim ilk gelen terim Thread olmuştur. Microsoft .Net kütüphaneleri içerisinde de 4.0 versiyonuna kadar paralel işlemlerde başvurduğumuz kaynak Thread olmuştur. Thread .Net platformu için özel olarak hazırlanmış sınıfları içermektedir. Thread’ler kullanımı ile ilgili kontrolü geliştiriciye bıraktığından geliştiriciler kontrol edilebilirlik açısından dikkat edilmesi gereken yapılar haline gelmişlerdir. Bunu biraz açarsak bir iş yapılacağı zaman Thread kullanıldığında aynı anda yapılması gereken diğer iş için verilecek refleksi Thread kendisi belirlemeyip geliştiricinin kontrol etmesini bekleyebilir. Bu süreç bellekteki işlemi sıraya koyma da olabilir, bekleyen Thread’i sıraya alma işlemi de olabilmektedir. Thread yapılacak olan bir işlemde bu işleme özel yeni bir Thread oluşturulmasını garanti etmeyebilir veya oluştursa dahi bu Thread’i o işlem esnasında kullanacağı konusunda kesinlik vermeyecektir.

THREADPOOL

ThreadPool yine Microsoft .Net platformu tarafından bize sunulmaktadır. Thread’ lerden farkı ise kullanım esnasında kontrolün tamamen geliştiriciye bırakılması yerine kütüphane tarafından bazı kısıtlar getirilerek kontrol edilmektedir.  ThreadPool, Thread’in aksine yeni bir işlem için yeni bir Thread oluşturacağını ve bunu kullanacağını garanti etmektedir. Yani paralel olarak yapılmasını istediğimiz bir iş için ThreadPool kullanılması durumunda Framework yani kütüphanemiz bizi boru hattındaki diğer işlemlerle beraber sıraya koyacak ve tüm kontrolü elinde tutacaktır. ThreadPool, kontrolü elinde tutarken işlem sırasındaki Thread’ i işleme alıp anında görev olarak atayacak ve işlemin süreçteki en optimum sürede tamamlanmasını sağlayacaktır.

Resim-2

 

TASK

WEB API’ lerde sıklıkla kullanılan özellikle Microsoft geliştirici kütüphanesinde .Net 4.0 ve üzeri konuları çalışanların karşılaştıkları diğer bir konu da Task’ lerdir. Task’ ler paralel işlemlerin nesnelleştirildiği bir sınıftır. Task’ in işletilmesi ThreadPool sınıfı ile gerçekleşir. Task’ ler System.Threading isim uzayı (namespace) altında bulunurlar. Task kullanırken arka tarafta bir Thread oluşuyor diyemeyiz fakat arka tarafta işlem Abstract yani soyut bir sınıf olan TaskScheduler tarafından gerçekleşmektedir. Bu sınıfın arkasında ise ThreadPool vardır buradan hareketle az önce de belirtildiği gibi bir Task’ in yürütülmesi işini ThreadPool üstlenmektedir. Eğer zaten işlemi arka tarafta ThreadPool yapıyor ise niçin Task’lere ihtiyaç duyduğumuz düşünülebilir. Elbette önceki başlıkta açıkladığımız gibi doğrudan ThreadPool da kullanabiliriz ancak Task kullanmamız durumunda süreçteki işlemin bitiş zamanını, iptale düştüyse niçin ve nerede iptale düştüğünü hatta bir hata olması durumunda exception durumu hakkında bilgi sahibi olabilmekteyiz. Bu yüzden Task kullanımı daha efektif olmaktadır.

Resim-3

Task içerdiği bu bilgilerin yanı sıra ContinueWith(), Wait(), WaitAll(), StartNew() gibi metotlar içermektedir.

StartNew( )

Yeni bir Task oluşturmak için StartNew( ) metodu kullanılmaktadır. Aşağıdaki kod örneklerinde yeni bir Task oluşturulması gösterilmiştir.

Task YeniTask = Task.Factory.StartNew ( ( ) => DoWork ( ) );

static void DoWork ( ) {

// to do

}

 

Task.ContinueWith( ) – Task.Wait( ) –  WaitAll( )

Oluşturulan bir Task’ in sonucuna göre bir başka Task’ in işlem yapması gerekebilir. Devam eden Task’ e göre işlem yaptırılan Task özelliği ContinueWith( ) ile verilir. Örnek ile daha iyi anlayabilmek için aşağıdaki kodları inceleyelim.

// Önce yeni bir Task oluşturuyoruz.

Task<int> BirinciTask = Task.Factory.StartNew ( ( ) =>

ilkSurec (deger) );

// daha sonra ilk Task’ i kullanarak işlem yapılacağını belirterek ikinci Task’i oluşturuyoruz.

Task<int> ikinciTask = ilkTask.ContinueWith(FromilkSurecValue=>

ikinciSurec(FromilkSurecValue));

}

// Burada metotlar yani ilkSurec ve ikinciSurec işletilir.

Static int ilkSurec (int değer)

{

Return değer=değer*5;

}

Static int ikinciSurec(int deger)

{

Return değer * 3;

}

 

Burada yapılmak istenen ikinci Task’ in oluşturulması ilkinden farklı olarak StartNew( ) metodu ile değil birinci Task’ in ContinueWith( ) metodu ile oluşturulmasıdır. Örnek olması açısından gerçek bir işlem yaptırmayıp iki metot içerisinde de hesaplama işlemi yapılıyormuş gibi bir kurgulama yaptım. Yani ilkinin sonucuna göre ikincinin sonucunun hesaplanması gibi bir şey düşünülebilir.  İlk Task bittiğinde diğeri ile devam etmesi gerektiğini belirtiyor bununla da ilk Task’ in kesinlikle doğru bir biçimde çalışacağı ve tamamlanacağı hakkında feedback vermiş oluyoruz.

Wait( ) metodu ile de Task’ ler içerisinde yapılan işlemlerin bekletilmesi yani beklemeye alınması sağlanmaktadır. Yukarıdaki kod örneğimizde ikinci Task bittikten sonra işlemi görebilmek amacıyla ikinciTask.Wait( ) şeklinde bir kod eklemesi yapılabilirdi. Bu örnekte olduğu gibi birbirine bağımlı işlem yapan Task’lere bağımlı yani Linked Task denilmektedir.

Eğer Task’ ler birbirlerine bağımlı olmayan ve aynı anda gerçekleştirilmesinde problem teşkil etmeyen yapıdalarsa böyle bir durumda WaitAll( ) metodu kullanılmalıdır. İşlemlerin çalışma zamanında birbirlerinden bağımsız bir şekilde ve aynı anda yürütülmesini istediğimiz durumlarda WaitAll ( ) metodu kullanılmaktadır. TaskAll ( ) metodu kullanımına ilişkin şöyle bir senaryo düşünebiliriz örneğin çok sayıda görevin yürütüldüğü bir süreçte her birini alakadar eden sonuçları ekrana yazdırmamız gerekiyor fakat her birinin bitip bitmediğinden emin değiliz. Böyle bir durumda Task’ lerin oluşturulması tamamlandığında tüm süreçler ile ilgili işlemleri Task.WaitAll metoduna gönderir ve hepsinin bittiğinden emin oluruz.

Bu makalemizde ASP.NET WEB API uygulamalarında sıklıkla kullanılan Thread, ThreadPool ve Task yapılarını inceledik. WEB API oluşturma bölümüne geçmeden önce bilmeyenler için konunun önemini bilenler için ise kısa bir hatırlatma yapmış olduk. Thread ve Task hakkında bilinmesi gereken çok fazla detay vardır fakat makalemizde C# programlama dili konseptlerine girmemek ve konu bütünlüğünden çok fazla çıkmamak adına yazı dizimizin bu bölümünü burada sonlandıralım.

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

 

Referanslar

www.mshowto.org

https://programmium.wordpress.com/2016/04/02/c-understanding-threads-and-threadpools/

https://social.msdn.microsoft.com/Forums/tr-TR/home

https://stackify.com/java-thread-pools/

 

TAGs: asp.net, asp.net web servisasp.net web API, API, Rest Servis, Soap, Wcf servis, Thread, ThreadPool, Task, Task Management, Task.Factory, Paralel Programlama, Asenkron Programlama, Görevler

 

Bu İçeriğe Tepkin Ne Oldu?
  • 4
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 0
    sevdim_
    Sevdim!
  • 1
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

Konya Teknik Üniversitesi Bilgisayar Mühendisliği Doktora programında tez dönemi öğrenciliğim devam etmektedir.İş hayatıma Vodafone'da Test Mühendisi olarak başladıktan sonra şuan bir üniversitede Sistem Uzmanı ve Siber Güvenlik Ofis Yöneticisi pozisyonunda çalışmaktayım.Başlıca uzmanlık alanlarım arasında Sistem yöneticiliği ve Siber Güvenlik gelmektedir.Asp.net ile Proje Geliştirme (2015), Bilgisayar Mühendisliğine Giriş (2020), Güvenlik Tasarım Desenleri (2022) kitaplarının yazarıyım.

Yazarın Profili

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir