C# Academy · Pelajaran

Batas waktu, IProgress<T>, disposable async (emulasi)

Terapkan batas waktu berbasis CancelAfter atau Task.WhenAny, hubungkan IProgress untuk pembaruan yang ramah UI, dan gunakan try/finally untuk mengemulasikan pembersihan async dalam C# 6.

Pelajaran 2 dari 38 langkah

Batas waktu, IProgress<T>, disposable async (emulasi) adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 3 pelajaran total.

Rencana

Tujuan:

  • Menetapkan batas waktu dengan CancelAfter
  • Menetapkan batas waktu melalui Task.WhenAny
  • Melaporkan kemajuan dengan IProgress<T>
  • Menggunakan pola pembersihan asinkron dalam C# 6 (try/finally)

Batas waktu melalui CancelAfter

Gunakan CancelAfter dan teruskan token ke API asinkron; metode yang dipanggil berhenti secara kooperatif saat batas waktu tercapai.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  static async Task<string> SlowOpAsync(CancellationToken ct)
  {
    // Simulate slow I/O that honors cancellation
    await Task.Delay(500, ct);
    return "OK";
  }

  public static void Main(string[] args)
  {
    var cts = new CancellationTokenSource();
    cts.CancelAfter(150); // timeout after 150 ms

    Task<string> t = SlowOpAsync(cts.Token);
    try
    {
      string result = t.GetAwaiter().GetResult(); // demo only
      Console.WriteLine(result);
    }
    catch (OperationCanceledException)
    {
      Console.WriteLine("Timed out");
    }
  }
}

Batas waktu melalui WhenAny

Task.WhenAny mengadu pekerjaan dengan Task.Delay; jika penundaan selesai lebih dahulu, lempar TimeoutException.

using System;
using System.Threading.Tasks;

public class Program
{
  // Wrap any Task<T> with a timeout using WhenAny
  static async Task<T> WithTimeoutAsync<T>(Task<T> work, int milliseconds)
  {
    Task delay = Task.Delay(milliseconds);
    Task first = await Task.WhenAny(work, delay);
    if (first == work) return await work; // completed in time
    throw new TimeoutException("Operation timed out");
  }

  static async Task<int> ComputeAsync()
  {
    await Task.Delay(300); // pretend work
    return 7;
  }

  public static void Main(string[] args)
  {
    try
    {
      int v = WithTimeoutAsync(ComputeAsync(), 100).GetAwaiter().GetResult();
      Console.WriteLine("Value " + v);
    }
    catch (TimeoutException ex)
    {
      Console.WriteLine(ex.Message);
    }
  }
}

Demo IProgress<T>

IProgress<T> memisahkan pekerjaan dari UI; produsen memanggil Report, sedangkan konsumen memperbarui UI atau utas dengan aman.

using System;
using System.Threading.Tasks;

public class Program
{
  static async Task DownloadAsync(IProgress<int> progress)
  {
    // Report 0..100 in steps; UI would receive ProgressChanged on its context
    for (int p = 0; p <= 100; p += 25)
    {
      await Task.Delay(60);
      if (progress != null) progress.Report(p);
    }
  }

  public static void Main(string[] args)
  {
    Progress<int> prog = new Progress<int>(percent =>
    {
      Console.WriteLine("Progress: " + percent + "%");
    });

    DownloadAsync(prog).GetAwaiter().GetResult();
  }
}

Pola pembersihan asinkron

C# 6 belum memiliki IAsyncDisposable; gunakan try/finally dan lakukan pembuangan di dalam finally setelah pekerjaan yang ditunggu selesai.

using System;
using System.IO;
using System.Threading.Tasks;

public class Program
{
  static async Task WriteThenCloseAsync(string path)
  {
    // C# 6 has no IAsyncDisposable; emulate with try/finally.
    FileStream fs = null;
    StreamWriter sw = null;
    try
    {
      fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None);
      sw = new StreamWriter(fs);
      await sw.WriteAsync("hello"); // do async work
      await sw.FlushAsync();        // ensure data is flushed
    }
    finally
    {
      // Dispose synchronously in finally
      if (sw != null) sw.Dispose();
      else if (fs != null) fs.Dispose();
    }
  }

  public static void Main(string[] args)
  {
    WriteThenCloseAsync("out.txt").GetAwaiter().GetResult();
    Console.WriteLine("Written");
  }
}

Praktik terbaik

Kiat:

  • Utamakan CancelAfter untuk batas waktu operasi yang sederhana.
  • Gunakan WhenAny untuk alur batas waktu khusus.
  • Jaga agar tipe kemajuan tetap sederhana (misalnya, int persentase atau struct sederhana).
  • Selalu selesaikan semua penantian sebelum membuang sumber daya; letakkan pembuangan di dalam finally.

Pola batas waktu

Pemeriksaan singkat: Apa cara sederhana untuk menambahkan batas waktu ke operasi asinkron dalam C# 6 tanpa memblokir?

Ringkasan

Ringkasan: Terapkan batas waktu dengan CancelAfter atau WhenAny, laporkan kemajuan melalui IProgress<T>, dan tirukan pembuangan asinkron dengan try/finally dalam C# 6.

Gratis untuk memulai

Belajar C# dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
93
Pelajaran
346

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Batas waktu, IProgress<T>, disposable async (emulasi)” gratis?

Ya — teks lengkap “Batas waktu, IProgress<T>, disposable async (emulasi)” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 3 pelajaran total.

Apa yang akan aku pelajari di “Batas waktu, IProgress<T>, disposable async (emulasi)”?

Terapkan batas waktu berbasis CancelAfter atau Task.WhenAny, hubungkan IProgress untuk pembaruan yang ramah UI, dan gunakan try/finally untuk mengemulasikan pembersihan async dalam C# 6. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 3.

Berapa lama pelajaran “Batas waktu, IProgress<T>, disposable async (emulasi)” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pola CancellationToken; pembatalan kooperatif
  2. Batas waktu, IProgress , disposable async (emulasi)
  3. Dasar-dasar ketahanan: percobaan ulang & jeda bertahap
← Kembali ke C# Academy