C#
Task.WhenAny
Task.WhenAny ile ilk biteni beklemeyi öğrenirsin.
Task.WhenAny
Task.WhenAny birden fazla Task'ın ilki bitene dek bekler. Dönen Task, tamamlanan ilk Task'ı içerir. Örnek: Task<int> first = await Task.WhenAny(t1, t2);. Burada first tamamlanan ilk Task'tır; await first ile sonucunu alabilirsin.
Yarış senaryolarında kullanışlıdır: iki kaynaktan gelen yanıtlardan hızlı olanı seçmek gibi. Kaybeden Task'lar arka planda çalışmaya devam eder; iptal etmek senin sorumluluğundur.
WhenAny kullanımı
WhenAny sonucu bir Task döndürür; doğrudan değer değil. Örneğin await Task.WhenAny(t1, t2) bir Task döndürür (hangi task'ın bittiğini gösterir). Değeri almak için o task'ı da await etmen gerekir: int val = await first;.
Daha temiz yazım: önce var first = await Task.WhenAny(t1, t2);, sonra int val = await first;. Bu, özellikle iptal edilebilir işlerde okunaklıdır.
Uygulama WhenAny ile ilk biteni al
İki metot tanımla: static Task<int> Source1() ve static Task<int> Source2(). Her ikisi de return Task.FromResult(15); döndürsün. Main'i static async Task Main yap. Task<int> first = await Task.WhenAny(Source1(), Source2()); ile ilk biteni al, int val = await first; ile değeri al ve Console.WriteLine(val); ile yazdır.
Örnek çözümü göster
return Task.FromResult(15);. Main'i static async Task Main() yapıp Task<int> first = await Task.WhenAny(Source1(), Source2()); int val = await first; Console.WriteLine(val);
Örnek çözüm:
using System;
using System.Threading.Tasks;
class Program
{
static Task<int> Source1()
{
return Task.FromResult(15);
}
static Task<int> Source2()
{
return Task.FromResult(15);
}
static async Task Main()
{
Task<int> first = await Task.WhenAny(Source1(), Source2());
int val = await first;
Console.WriteLine(val);
}
}
Kendini test et
-
WhenAll ve WhenAny farkını eşleştir
- WhenAll
- Tüm Task'ları bekler
- WhenAny
- İlk biten Task'ı bekler
- Task.FromResult
- Hazır sonuçlu Task üretir
- Task.Run
- İşi havuza gönderir
-
WhenAny ne döndürür?
- Doğrudan değeri döndürür
- Void döndürür
- Tamamlanan ilk Task'ı döndürür
- Tüm Task'ların sonuçlarını dizi olarak döndürür
Cevabı göster
Tamamlanan ilk Task'ı döndürür — Doğru. WhenAny tamamlanan ilk Task'ı döndürür.
-
WhenAny çağrısını tamamla
Task<int> first = await Task.____(t1, t2);
Cevabı göster
Task<int> first = await Task.WhenAny(t1, t2);
Sıradaki ders: CancellationToken