C#
Özet - Task ve ContinueWith
WhenAll, WhenAny ve CancellationToken'ı birleştirerek bir paralel indirici yazarsın.
Özet - Task ve ContinueWith
Bu grupta Task işlemlerinin temellerini öğrendin: Task.Run ile işi havuza gönderirsin; ContinueWith ile devamlılık kaydedersin; Task.WhenAll tüm Task'ları bekler; Task.WhenAny ilk biteni bekler; CancellationToken ile işi dışarıdan iptal edersin.
En önemli ipucu: yeni kodda await çoğunlukla ContinueWith'ten daha temizdir. İptal için ThrowIfCancellationRequested kullan. Şimdi tüm bunları birleştiren bir uygulama yazacağız.
Uygulama WhenAll ile iki metodu birleştir
static Task<int> GetA() tanımla (return Task.FromResult(10);). static Task<int> GetB() tanımla (return Task.FromResult(20);). Main'i static async Task Main yap. int[] arr = await Task.WhenAll(GetA(), GetB()); ile bekle, Console.WriteLine(arr[0] + arr[1]); ile toplamı yazdır.
Örnek çözümü göster
return Task.FromResult(10); ve return Task.FromResult(20);. Main'i static async Task Main() yapıp int[] arr = await Task.WhenAll(GetA(), GetB()); Console.WriteLine(arr[0] + arr[1]);
Örnek çözüm:
using System;
using System.Threading.Tasks;
class Program
{
static Task<int> GetA()
{
return Task.FromResult(10);
}
static Task<int> GetB()
{
return Task.FromResult(20);
}
static async Task Main()
{
int[] arr = await Task.WhenAll(GetA(), GetB());
Console.WriteLine(arr[0] + arr[1]);
}
}
İpuçları
Birkaç ipucu: Task.Run yalnızca CPU işleri için; giriş/çıkış işleri için doğrudan async metot çağır. ContinueWith yerine await tercih et. Çoklu Task'ları beklemek için WhenAll, yarış için WhenAny kullan.
İptal edilebilir metotlar yazarken her zaman CancellationToken parametresi al ve döngü içinde ThrowIfCancellationRequested çağır. İptal bir hata değil, beklenen bir akıştır.
Uygulama Mini uygulama: Paralel kareler
static Task<int> Compute(int x) tanımla (return Task.FromResult(x * x);). Main'i static async Task Main yap. int[] arr = await Task.WhenAll(Compute(3), Compute(4)); ile iki kareyi paralel hesapla, Console.WriteLine(arr[0] + arr[1]); ile toplamı yazdır (3² + 4² = 9 + 16 = 25).
Örnek çözümü göster
Compute gövdesinde return Task.FromResult(x * x); yaz. Main'i static async Task Main() yapıp int[] arr = await Task.WhenAll(Compute(3), Compute(4)); Console.WriteLine(arr[0] + arr[1]);
Örnek çözüm:
using System;
using System.Threading.Tasks;
class Program
{
static Task<int> Compute(int x)
{
return Task.FromResult(x * x);
}
static async Task Main()
{
int[] arr = await Task.WhenAll(Compute(3), Compute(4));
Console.WriteLine(arr[0] + arr[1]);
}
}
Kendini test et
-
Task.WhenAll ne yapar?
- Tüm Task'ları bekler
- İlk Task'ı bekler
- Task'ları iptal eder
- Task'ları sırayla çalıştırır
Cevabı göster
Tüm Task'ları bekler — Doğru. WhenAll tüm Task'lar bitene dek bekler.
Sıradaki ders: async try/catch