.Net ile Asenkron Programlama

recep orhan
3 min readOct 27, 2021
Photo by Andrew Coop on Unsplash

Bu yazıda uzun uzun asenkron programlama ve metotlarını anlatmak yerine kavramın mantığından kısaca bahsedip örnek üzerinden senkron ve asenkron uygulama farkını anlatacağım. Asenkron programlamanın temel mantığını kavradıktan sonra microsoft dökümanı üzerinden asenkron programlama ve asenkron programlama pattern’ları öğrenilebilir.

Asenkron programlama bir işin yapılırken başka işlerin bekletilmemesi(blocking) demektir. Bunu aynı thread’ de ya da farklı threadler kullanarak yapar. Mesela 5, 6, 7 saniye süren ve birbirinin sonucundan bağımsız olarak çalışan 3 adet metodumuz olsun. Bu metotları senkron olarak çalıştırdığımızda önce 5 saniyelik metot çalışacak, bittikten sonra 6 saniyelik metot ve sonrasında 7 saniyelik metot çalışacak. Aynı senaryoyu asenkron olarak kurgularsak 5, 6 ve 7 saniyelik metotlar aynı anda başlayacak ve 5. saniyede ilk metot 1 saniye sonra 6 saniyelik metot 1 saniye sonra 7 saniyelik metot bitecek. Toplamda 7 saniyede tüm metotlar çalışmış olacak. Gelin bunu c# ile kodlayalım ve çıktıları somut olarak görelim.

Öncelikle senkron çalışan kodumuzu yazalım. SyncMethod adında senkron olarak çalışan bir metod yazacağız. Bu metot Thread.Sleep ile aldığı parametre kadar bekletilecek.

Metodu 6, 7 ve 8 parametresi ile 3 defa çağırarak farklı sürelerde çalışan 3 metodu simüle ediyoruz. Stopwatch ile kodun başlangıç ve bitiş zamanını alarak toplam çalışma süresini elde ediyoruz.

Kodu çalıştırdığımızda senkron kodun çalışması aşağıdaki gibi olacak.

Metotlar sırayla başladı ve bitti, kodun baştan sona çalışması toplam18 saniye sürdü.

Şimdi aynı kodu asenkron olarak yazalım. Öncelikle SyncMethod un asenkron biçimini yazalım.

Task.Delay metodu aynı Thread.Sleep gibi içine aldığı değer kadar gecikme sağlıyor, Thread.Sleep te ana Thread de bekletilirken(blocking) Task.Delay de sadece çalışan kod’da bekleme olur bu ana thread ile aynı ya da farklı bir thread olabilir.

Her AsyncMethod u çağırdığımızda geriye Task türünde dönüş yapacak. Task.WhenAll metoduna bu taskları vererek birleştiriyoruz ve hepsinin bitmesini beklemek için await keyword’ünü kullanıyoruz.

Kodu çalıştırdığımızda 5, 6 ve 7 saniyelik metodların aynı anda başladığını ve birer saniye arayla bitişini görebiliyoruz. Kodun çalışması 7 saniye olarak görülmektedir. Bu asenkron metoddan 7 saniye ve altı yüzlerce kere daha çalıştırsak hepsi aynı anda başlayacağı için toplamda yine 7 saniye sürecekti. Şimdi bu kodun içine await keyword’ünden önce bir adette senkron olarak çalışan 7 saniyelik kod ekleyelim ve toplam süreyi görelim.

Await keyword’ünden önce senkron metodu da çağırdığımız için ana thread asenkron kodların çalışmasını beklemedi, bu arada senkron metot da başlatıldı. Toplam süre 7.1 saniye olarak gerçekleşti. Eğer aynı senkron kodu await ten sonra yazsaydık ana thread tüm taskların bitmesini bekleyecekti sonrasında 7 saniyelik senkron metodu çalıştıracaktı toplam süre 14 saniye olacaktı.

Asenkron uygulamayı bilinçli ve efektif bir şekilde uygulayabilmek için Task sınıfının WhenAll, WaitAll, ContinueWith, Run, StartWith, WhenAny, WaitAny gibi metotlarını bilmek, ayrıca task sınıfı propertylerine hakim olmak gerekmektedir.

Bu yazıda kısaca örnekler üzerinden senkron ve asenkron uygulamayı anlattım. Umarım faydalı olmuştur. Yukardaki kodun örneğine github linkinden ulaşabilirsiniz.

--

--