C# Academy · บทเรียน

การหมดเวลา IProgress<T> และทรัพยากร async (การจำลอง)

ใช้การหมดเวลาด้วย CancelAfter หรือ Task.WhenAny เชื่อม IProgress เพื่ออัปเดตที่เหมาะกับ UI และใช้ try/finally จำลองการทำความสะอาดแบบ async ใน C# 6

บทเรียน 2 จาก 38 ขั้นตอน

การหมดเวลา IProgress<T> และทรัพยากร async (การจำลอง) เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

แผนการ

เป้าหมาย:

  • กำหนดเวลาหมดเวลาด้วย CancelAfter
  • กำหนดเวลาหมดเวลาด้วย Task.WhenAny
  • รายงานความคืบหน้าด้วย IProgress<T>
  • ใช้รูปแบบการล้างทรัพยากรแบบอะซิงโครนัสใน C# 6 ด้วย try/finally

กำหนดเวลาหมดเวลาด้วย CancelAfter

ใช้ CancelAfter และส่งโทเค็นให้ API แบบอะซิงโครนัส เมื่อหมดเวลา เมธอดที่ถูกเรียกจะหยุดทำงานแบบร่วมมือกัน

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");
    }
  }
}

กำหนดเวลาหมดเวลาด้วย WhenAny

Task.WhenAny แข่งขันระหว่างงานกับ Task.Delay หากการหน่วงเวลาชนะ ให้โยน 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);
    }
  }
}

การสาธิต IProgress<T>

IProgress<T> แยกงานออกจากส่วนติดต่อผู้ใช้ ผู้ผลิตเรียก Report ส่วนผู้ใช้นำไปอัปเดตส่วนติดต่อผู้ใช้หรือเธรดอย่างปลอดภัย

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();
  }
}

รูปแบบการล้างทรัพยากรแบบอะซิงโครนัส

C# 6 ไม่มี IAsyncDisposable ให้ใช้ try/finally และล้างทรัพยากรใน finally หลังงานที่รอเสร็จสมบูรณ์แล้ว

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");
  }
}

แนวทางปฏิบัติที่ดี

เคล็ดลับ:

  • เลือกใช้ CancelAfter สำหรับการกำหนดเวลาหมดเวลาของการดำเนินการแบบง่าย
  • ใช้ WhenAny สำหรับกระบวนการกำหนดเวลาหมดเวลาแบบกำหนดเอง
  • ทำชนิดข้อมูลความคืบหน้าให้มีขนาดเล็ก เช่น จำนวนเต็มแสดงเปอร์เซ็นต์หรือโครงสร้างข้อมูลแบบง่าย
  • รอการทำงานแบบอะซิงโครนัสทั้งหมดให้เสร็จก่อนล้างทรัพยากรเสมอ โดยวางการล้างทรัพยากรไว้ใน finally

รูปแบบการกำหนดเวลาหมดเวลา

ตรวจสอบความเข้าใจอย่างรวดเร็ว: วิธีง่าย ๆ ในการเพิ่มการกำหนดเวลาหมดเวลาให้การดำเนินการแบบอะซิงโครนัสใน C# 6 โดยไม่บล็อกคืออะไร

ทบทวน

ทบทวน: ใช้ CancelAfter หรือ WhenAny เพื่อกำหนดเวลาหมดเวลา รายงานความคืบหน้าผ่าน IProgress<T> และจำลองการล้างทรัพยากรแบบอะซิงโครนัสด้วย try/finally ใน C# 6

เริ่มต้นได้ฟรี

เรียนรู้ C# ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
93
บทเรียน
346

คำถามที่พบบ่อย

บทเรียน “การหมดเวลา IProgress<T> และทรัพยากร async (การจำลอง)” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การหมดเวลา IProgress<T> และทรัพยากร async (การจำลอง)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การหมดเวลา IProgress<T> และทรัพยากร async (การจำลอง)”

ใช้การหมดเวลาด้วย CancelAfter หรือ Task.WhenAny เชื่อม IProgress เพื่ออัปเดตที่เหมาะกับ UI และใช้ try/finally จำลองการทำความสะอาดแบบ async ใน C# 6 คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน

บทเรียน “การหมดเวลา IProgress<T> และทรัพยากร async (การจำลอง)” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. รูปแบบ CancellationToken และการยกเลิกแบบร่วมมือกัน
  2. การหมดเวลา IProgress และทรัพยากร async (การจำลอง)
  3. พื้นฐานความทนทาน: การลองใหม่และการหน่วงเพิ่ม
← กลับไปที่ C# Academy