CodeBlanks Logo Icon CodeBlanks

ContinueWith

C# kursu · İleri seviye · Ders 8/83

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

  1. ContinueWith çağrısını tamamla

    task.____(t => Next());
    Cevabı göster
    task.ContinueWith(t => Next());
  2. 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ı
  3. 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.

İleri seviye bölümündeki tüm dersler