0Pricing
C# Academy · บทเรียน

พื้นฐานความทนทาน: การลองใหม่และการหน่วงเพิ่ม

ใช้การลองใหม่อย่างง่ายด้วยการหน่วงแบบทวีคูณและการสุ่มหน่วง ตรวจแยกข้อผิดพลาดชั่วคราวกับข้อผิดพลาดร้ายแรง จำกัดเวลาหน่วง และหยุดเมื่อมีการยกเลิก

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

เหตุผลที่ต้องลองใหม่และเพิ่มเวลาหน่วง

เป้าหมาย: ทำให้การเรียกมีความทนทาน

  • ลองใหม่เมื่อเกิดข้อผิดพลาด ชั่วคราว
  • ใช้ การเพิ่มเวลาหน่วงแบบทวีคูณ ร่วมกับความหน่วงแบบสุ่ม
  • กำหนด จำนวนครั้งสูงสุด และ เวลาหน่วงสูงสุด
  • หยุดเมื่อเกิดข้อผิดพลาด ร้ายแรง หรือมีการยกเลิก

จัดประเภทข้อผิดพลาด

ชั่วคราว: การหมดเวลา รหัส 429/5xx และปัญหาเครือข่ายชั่วคราว

ร้ายแรง: คำขอไม่ถูกต้อง ไม่ได้รับอนุญาต และข้อผิดพลาดในการตรวจสอบข้อมูล — ไม่ควรลองใหม่

กฎ: ให้ลองใหม่เฉพาะสิ่งที่อาจสำเร็จได้ในภายหลัง

ตัวช่วยเพิ่มเวลาหน่วง

ตัวช่วยขนาดเล็กจะเพิ่มเวลาหน่วงตามจำนวนครั้งที่ลอง และเพิ่มความหน่วงแบบสุ่มเล็กน้อย พร้อมจำกัดเวลาหน่วงสูงสุด

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

public static class Backoff
{
  // Compute delay = min(base * 2^attempt, cap) + jitter
  public static int ComputeDelayMs(int attempt, int baseMs, int capMs, int jitterMs, Random rng)
  {
    long exp = (long)baseMs << attempt; // base * 2^attempt
    if (exp > capMs) exp = capMs;
    int jitter = rng.Next(0, jitterMs + 1); // [0..jitterMs]
    return (int)exp + jitter;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Random rng = new Random(123);
    for (int i = 0; i < 5; i++)
    {
      int d = Backoff.ComputeDelayMs(i, 100, 2000, 50, rng);
      Console.WriteLine("Attempt " + i + " -> " + d + " ms");
    }
  }
}

ตัวห่อการลองใหม่

ห่อการเรียกไว้ โดยลองใหม่เฉพาะเมื่อเกิดข้อยกเว้น ชั่วคราว และหยุดเมื่อเกิดข้อยกเว้นอื่น การลองใหม่แต่ละครั้งจะรอนานขึ้นพร้อมความหน่วงแบบสุ่ม

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

public class Program
{
  static readonly Random Rng = new Random();

  // Simulate an operation that sometimes fails transiently.
  static async Task<string> FlakyAsync()
  {
    await Task.Delay(60);
    // 50% chance of transient failure
    if (DateTime.UtcNow.Ticks % 2 == 0) throw new TimeoutException("Transient");
    return "OK";
  }

  static async Task<T> RetryAsync<T>(Func<Task<T>> action, int maxAttempts)
  {
    int baseMs = 100, capMs = 2000, jitterMs = 50;
    for (int attempt = 0; attempt < maxAttempts; attempt++)
    {
      try
      {
        return await action();
      }
      catch (TimeoutException)
      {
        if (attempt == maxAttempts - 1) throw; // out of retries
        int delay = Backoff.ComputeDelayMs(attempt, baseMs, capMs, jitterMs, Rng);
        await Task.Delay(delay);
      }
      catch (Exception)
      {
        // Non-transient (unknown) -> do not retry
        throw;
      }
    }
    throw new InvalidOperationException("Unreachable");
  }

  public static void Main(string[] args)
  {
    try
    {
      string s = RetryAsync(FlakyAsync, 5).GetAwaiter().GetResult();
      Console.WriteLine("Result: " + s);
    }
    catch (Exception ex)
    {
      Console.WriteLine("Failed: " + ex.GetType().Name);
    }
  }
}

การลองใหม่ภายใต้งบเวลา

เพิ่ม งบเวลารวม ผ่านการยกเลิก โดยส่งโทเค็นให้ทั้งการดำเนินการและ การหน่วงเวลาระหว่างการลองใหม่

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

public static class RetryUtil
{
  static readonly Random Rng = new Random();

  public static async Task<T> RetryAsync<T>(Func<CancellationToken, Task<T>> action, int maxAttempts, CancellationToken ct)
  {
    int baseMs = 100, capMs = 1500, jitterMs = 50;
    for (int attempt = 0; attempt < maxAttempts; attempt++)
    {
      ct.ThrowIfCancellationRequested();
      try
      {
        return await action(ct);
      }
      catch (TimeoutException)
      {
        if (attempt == maxAttempts - 1) throw;
        int delay = Backoff.ComputeDelayMs(attempt, baseMs, capMs, jitterMs, Rng);
        await Task.Delay(delay, ct); // pass token so we can abort waiting
      }
    }
    throw new InvalidOperationException("Unreachable");
  }
}

public class Program
{
  static async Task<string> SometimesSlowAsync(CancellationToken ct)
  {
    await Task.Delay(200, ct);
    if (DateTime.UtcNow.Millisecond % 3 != 0) throw new TimeoutException("Transient");
    return "OK";
  }

  public static void Main(string[] args)
  {
    var cts = new CancellationTokenSource();
    cts.CancelAfter(800); // overall budget

    try
    {
      string s = RetryUtil.RetryAsync(SometimesSlowAsync, 5, cts.Token).GetAwaiter().GetResult();
      Console.WriteLine("Done: " + s);
    }
    catch (OperationCanceledException) { Console.WriteLine("Canceled"); }
    catch (Exception ex) { Console.WriteLine("Failed: " + ex.Message); }
  }
}

แนวทาง

เคล็ดลับ:

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

คำจำกัดความของการเพิ่มเวลาหน่วง

ตรวจสอบความเข้าใจอย่างรวดเร็ว: ข้อใดอธิบายการเพิ่มเวลาหน่วงแบบทวีคูณร่วมกับความหน่วงแบบสุ่มได้ดีที่สุด

ทบทวน

ทบทวน: ลองใหม่เฉพาะข้อผิดพลาดชั่วคราว เพิ่มเวลาหน่วงแบบทวีคูณพร้อม ขีดจำกัดสูงสุด เพิ่ม ความหน่วงแบบสุ่ม และหยุดเมื่อมีการยกเลิกหรือเกิดข้อผิดพลาดร้ายแรง

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

บทเรียน “พื้นฐานความทนทาน: การลองใหม่และการหน่วงเพิ่ม” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐานความทนทาน: การลองใหม่และการหน่วงเพิ่ม”

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

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

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

บทเรียน “พื้นฐานความทนทาน: การลองใหม่และการหน่วงเพิ่ม” ใช้เวลานานแค่ไหน

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

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

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

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

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