İçeriğe geç

Async/Await ile Asenkron İşlemler: İşleri Hızlandırmanın İncelikleri

Geçenlerde bir projede çalışırken, benim de yıllar önce yaşadığım bir kampa gitme hevesim depreşti. Hani o ilk gençlik heyecanıyla, sırt çantayı kapıp doğaya karışma isteği var ya, işte öyle bir şeydi. O zamanlar programlama dünyası şimdiki kadar renkli değildi tabi, ama yine de en az bu kadar ‘hadi şunu da yapalım, bunu da deneyelim’ modundaydım. Bir ara devre tasarlamaya çalıştığım bir proje vardı, inanılmaz basitti ama bir türlü istediğim gibi çalışmıyordu. Günlerce uğraşmıştım, sanki görünmez bir el her şeyi bozuyordu. Sonunda anladım ki, bir komponentin yanlış pinine kabloyu takmışım. Yani şey gibi… neyse anladın sen 🙂

İşte bu kadar basit hatalar yüzünden bazen günlerimiz gidiyor, sinirlerimiz geriliyor ama işin sonunda o hatayı bulup çözdüğünde gelen o tatmin duygusu bambaşka oluyor. Neyse efendim, konumuza dönelim. Bugün size async/await ile asenkron işlemlerden bahsedeceğim. Hani şu işleri paralel yapıp, programımızın takılmasını engelleyen sihirli dokunuş var ya, işte ondan.

Aslında bu konu, özellikle web geliştiricileri için çok önemli. Düşünsene, bir kullanıcı senden bir veri istiyor ve senin de o veriyi almak için bir sürü işlem yapman gerekiyor. Veritabanına bağlanacaksın, oradan bilgiyi çekeceksin, belki başka bir servisten de ek bilgi alacaksın, sonra hepsini birleştirip kullanıcıya göndereceksin. Eğer bunları tek tek, sırayla yaparsan, kullanıcı sayfada beklemekten sıkılır, belki de sayfayı kapatır gider. Ne güzel değil mi? Yani programımız çalışırken başka işler de yapabilirse, kullanıcı deneyimi de yükselir, bizim de işimiz kolaylaşır.

İşte tam burada async ve await devreye giriyor. Bunlar sayesinde, bir işlem bitene kadar programın beklemesini sağlamak yerine, o işlem arka planda devam ederken sen başka şeylerle ilgilenebiliyorsun. Tabi bu bir senkronize işlemde olmaz. Senkronize işlemde, bir iş bitmeden diğerine geçemezsin. Yani sen bir kampa gittiğinde, önce çadırı kurarsın, sonra odunu toplarsın, sonra ateşi yakarsın. Hepsi sırayla, değil mi?

Async ve await’in olayı da tam olarak bu. Async bir metot tanımladığında, o metotun asenkron çalışacağını belirtmiş oluyorsun. Yani ‘Benim işim biraz uzun sürecek, sen git başka işini yap, ben bitince haber veririm’ demiş gibi oluyorsun. Await ise, bu ‘haber verince’ kısmını yönetiyor. Bir async metodun içinde await kullandığında, o satırda bekliyorsun ama programın diğer yerleri çalışmaya devam ediyor. Sanki bir restorana gittin, yemeğin pişmesini beklerken telefonunla biraz dolaşıyorsun, işte öyle.

Peki, bunun pratik bir örneği nasıl olur? Mesela bir API’den veri çekeceğiz diyelim. Normalde bunu HttpClient ile yaparken `GetAsync` metoduyla yaparız. Ama bu metot bize direkt sonucu vermez, bir Task döndürür. Biz de o Task’in bitmesini beklememiz gerekir. İşte await tam burada işe yarıyor. Gelin bir bakalım şöyle basit bir örnekle:

Şimdi ilk önce standart bir senkronize yaklaşımı düşünelim:

“`csharp // YANLIŞ YAKLAŞIM: Senkron ve Bloklayıcı public string VeriCekSenkron() { using (HttpClient client = new HttpClient()) { HttpResponseMessage response = client.GetAsync(\”https://jsonplaceholder.typicode.com/todos/1\”).Result; response.EnsureSuccessStatusCode(); string responseBody = response.Content.ReadAsStringAsync().Result; return responseBody; } } “`

Gördüğünüz gibi, `.Result` kullandık. Bu, metot bitene kadar programın tamamen durmasına neden oluyor. Yani sen yemeğin pişmesini beklerken, telefonuna gelen mesajlara bile bakamıyorsun gibi bir durum. Bu, özellikle kullanıcı arayüzü olan uygulamalarda programın kilitlenmesine yol açar. İnanın ki, bunu yaşayan çok insan gördüm. Kendi programım sınıfta kaldı 🙂

Şimdi gelelim işin can alıcı noktasına, async ve await ile bu işi nasıl daha güzel yapabiliriz:

“`csharp // DOĞRU YAKLAŞIM: Asenkron ve Bloklamayan public async Task<string> VeriCekAsync() { using (HttpClient client = new HttpClient()) { HttpResponseMessage response = await client.GetAsync(\”https://jsonplaceholder.typicode.com/todos/1\”); response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync(); return responseBody; } } “`

Bakın, ne kadar sadeleşti değil mi? `GetAsync` ve `ReadAsStringAsync` metotlarının başına `await` koyduk. Bu sayede, bu metotlar çalışırken programımız başka işler yapmaya devam edebilecek. Ve metotun dönüş tipi de `Task<string>` oldu. Bu, metotun asenkron bir işlem sonucunda bir string döndüreceğini belirtiyor. Bu arada, bu veriyi alıp ekrana basmak için de ayrı bir async metot yazmak gerekebilir, ama şimdilik bu kadarını bilsek yeterli sanırım.

Neticede, bu async/await yapısı, özellikle yoğun ağ işlemleri veya disk G/Ç işlemleri gibi uzun süren operasyonlarda hayat kurtarıyor. Uygulamalarınızın daha duyarlı olmasını sağlıyor ve kullanıcı deneyimini ciddi şekilde iyileştiriyor. Yani bir nevi, işleri hızlandırmanın ve daha akıllıca yapmanın yolu. Ne güzel değil mi? Bu teknoloji sayesinde, arka planda hem veri çekip hem de kullanıcıya animasyonlar gösterebilirsiniz mesela.

Bu arada, bu konuyu daha iyi anlamak için Google’da birkaç örnek daha karıştırabilirsiniz. Genelde bu tür konular için güzel kaynaklar çıkıyor karşıma. Özellikle YouTube’da da çok detaylı anlatımlar var, şuradan bir göz atabilirsiniz.

Sonuç olarak, async ve await, modern programlamanın olmazsa olmazlarından. Özellikle C# ve .NET ekosisteminde bu konuya hakim olmak, yazdığınız uygulamaların performansını ve kullanıcı memnuniyetini kat kat artıracaktır. Tabi, ilk başta biraz kafa karıştırıcı gelebilir, ama birkaç deneme yaptıktan sonra mantığını kavrarsınız diye umuyorum. Bana göre, her geliştiricinin bu konuda pratik yapması çok faydalı olur.

Bu arada, aklıma gelmişken, bu teknikleri kullanarak bir de e-ticaret sitesi için ürünleri listelerken arka planda reklamları da çekebilirsiniz. Yani şey gibi… neyse anladın sen 🙂 Düşünsenize, kullanıcı bir ürün listesine bakarken, aynı anda arka planda da ilgi alanına göre reklamlar yükleniyor. İnanın ki, bu tür optimizasyonlar kullanıcı deneyimini çok değiştiriyor.

Yani özetle, async/await ile işleri paralel yapıyoruz. Bir işi beklerken diğerleriyle ilgileniyoruz. Bu da programımızın daha hızlı, daha akıcı ve daha kullanıcı dostu olmasını sağlıyor. Sanırım bu kadar detay yeterli şimdilik. Gerçi daha anlatılacak çok şey var ama token limitini aşmamak lazım 🙂

Bir yanıt yazın

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.