async/await vs Task.Run: Hangisi Gerçekten Hızlı?

C# dünyasında en sık yapılan hata, async/await ile Task.Run'ı eş anlamlı sanmaktır. İkisi de "asenkron" görünüyor ama aslında tamamen farklı işler yapıyorlar.

async/await ne yapar?

async/await, thread bloklama olmadan beklemeyi sağlar. Bir işlem (örneğin veritabanı sorgusu) tamamlanana kadar, thread havuza geri döner ve başka işleri yapar. Kod yazılı gibi görünse de, arka planda çok verimli bir durum makinesi çalışır. I/O işlemleri için ideal: ağ, dosya, veritabanı.

Task.Run ne yapar?

Task.Run, işi thread havuzunun başka bir thread'ine iter. CPU-bound işlemler için kullanılır. Hesaplama yoğun bir görev varsa ve UI thread'ini bloklamak istemiyorsan, Task.Run'ı kullanırsın.

Gerçek fark nerede?

Bir API çağrısı düşün:

1// Doğru: async/await
2var data = await httpClient.GetAsync(url);
3
4// Yanlış: Task.Run ile
5await Task.Run(() => httpClient.GetAsync(url).Result);

İkinci örnekte ne olur? Thread havuzundan bir thread alınır, o thread API'yi çağırırken bloklanır. İlk örnekte ise, API yanıt verene kadar hiçbir thread bloklanmaz.

Peki Task.Run ne zaman lazım?

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

CPU-bound işlemler: büyük dosya işleme, karmaşık matematiksel hesaplamalar, veri dönüşümleri. Bu durumda thread havuzunun başka bir thread'i kullanan Task.Run mantıklı olur.

1// Doğru kullanım
2var result = await Task.Run(() => ExpensiveCalculation());

Performans gerçeği

async/await, I/O-bound işlemlerde kaynak tüketimini dramatik biçimde azaltır. Binlerce eşzamanlı bağlantı, tek bir thread havuzu ile yönetilir. Task.Run ise her işlem için bir thread ayırır; bu da bellek ve context switch maliyeti demektir.

Bir web sunucusu 10.000 eşzamanlı istek alırsa: async/await ile 50-100 thread yeterli olabilir, Task.Run ile 10.000 thread gerekir.

Sık yapılan hata

"async/await yavaş, Task.Run daha hızlı" düşüncesi yanlıştır. async/await, I/O işlemleri için çok daha hızlıdır. Task.Run, CPU işleri için kullanıldığında hızlı olur.

Sonuç

Kuralı basit tutun: I/O işlemleri için async/await, CPU işleri için Task.Run. İkisini karıştırmak, deadlock ve performans düşüşüne yol açar. async/await'i öğrenip doğru yerde kullanmak, modern C# uygulamalarının kalbi.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz