พื้นฐานความทนทาน: การลองใหม่และการหน่วงเพิ่ม
ใช้การลองใหม่อย่างง่ายด้วยการหน่วงแบบทวีคูณและการสุ่มหน่วง ตรวจแยกข้อผิดพลาดชั่วคราวกับข้อผิดพลาดร้ายแรง จำกัดเวลาหน่วง และหยุดเมื่อมีการยกเลิก
พื้นฐานความทนทาน: การลองใหม่และการหน่วงเพิ่ม เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- รูปแบบ CancellationToken และการยกเลิกแบบร่วมมือกัน
- การหมดเวลา IProgress และทรัพยากร async (การจำลอง)
- พื้นฐานความทนทาน: การลองใหม่และการหน่วงเพิ่ม