ContinueWith
ContinueWith ile task sonrası zincir kurmayı öğrenirsin.
ContinueWith nedir?
ContinueWith bir Task tamamlandığında çalışacak bir devamlılık (continuation) kaydeder. Örnek: task.ContinueWith(t => Next());. İlk task bitince Next çağrılır. Bu, görev zinciri kurmanın eski yoludur.
Modern C#'ta çoğu durumda await daha okunaklıdır. Yine de ContinueWith, çok adımlı zincirlerde ya da fire-and-forget senaryolarda yararlıdır. Devamlılığa önceki task t parametresi olarak geçer.
ContinueWith ve await farkı
ContinueWith ile await benzer işler yapar ama farklı biçimde. await doğal, doğrusal akış verir; derleyici devamlılığı otomatik oluşturur. ContinueWith ise açıkça lambda yazmanı ister.
await bağlam yakalar (varsayılan); ContinueWith yakalamaz. Bu yüzden kütüphane kodunda ContinueWith ile TaskScheduler.Default kullanımı yaygındır. Yeni kodda await öner.
Uygulama ContinueWith ile zincir kur
static Task<int> FirstStep() metodunu tanımla (return Task.FromResult(10);). Main'i static async Task Main yap. int doubled = await FirstStep().ContinueWith(prev => prev.Result * 2); ile devamlılığı bekleyip sonucu al ve Console.WriteLine(doubled); ile yazdır.
Örnek çözümü göster
FirstStep gövdesinde return Task.FromResult(10); yaz. Main'i static async Task Main() yapıp int doubled = await FirstStep().ContinueWith(prev => prev.Result * 2); Console.WriteLine(doubled);
Örnek çözüm:
using System;
using System.Threading.Tasks;
class Program
{
static Task<int> FirstStep()
{
return Task.FromResult(10);
}
static async Task Main()
{
int doubled = await FirstStep().ContinueWith(prev => prev.Result * 2);
Console.WriteLine(doubled);
}
}
Kendini test et
-
ContinueWith çağrısını tamamla
task.____(t => Next());Cevabı göster
task.ContinueWith(t => Next()); -
Kavramları eşleştir
- ContinueWith
- Devamlılık kaydeder
- await
- Doğal akış verir
- TaskScheduler.Default
- Havuz zamanlayıcı
- t => Next()
- Devamlılık lambdası
-
ContinueWith ne zaman yararlıdır?
- Her async çağrı yerine
- async void yerine
- Thread.Abort yerine
- Çok adımlı zincirlerde ya da fire-and-forget senaryolarda
Cevabı göster
Çok adımlı zincirlerde ya da fire-and-forget senaryolarda — Doğru. ContinueWith zincirlerde ve fire-and-forget için yararlıdır.