Async Concepts
Retry Plan
Model retry attempts before an operation succeeds.
async
Async calls to remote resources often retry failed attempts, but the retry policy can be modeled with ordinary control flow.
Retry Plan
RetryPlan.cs
Replay: real traced execution (multi-file project)
using System;
class Program
{
static void Main()
{
int failuresBeforeSuccess = 1;
int maxAttempts = 3;
int attempt = 0;
string status = "failed";
while (attempt < maxAttempts)
{
attempt++;
if (attempt > failuresBeforeSuccess)
{
status = "success";
break;
}
Console.WriteLine($"retryAfter={attempt}");
}
Console.WriteLine($"attempts={attempt}");
Console.WriteLine($"status={status}");
}
}
using System;
class Program
{
static void Main()
{
int failuresBeforeSuccess = 0;
int maxAttempts = 3;
int attempt = 0;
string status = "failed";
while (attempt < maxAttempts)
{
attempt++;
if (attempt > failuresBeforeSuccess)
{
status = "success";
break;
}
Console.WriteLine($"retryAfter={attempt}");
}
Console.WriteLine($"attempts={attempt}");
Console.WriteLine($"status={status}");
}
}
using System;
class Program
{
static void Main()
{
int failuresBeforeSuccess = 3;
int maxAttempts = 3;
int attempt = 0;
string status = "failed";
while (attempt < maxAttempts)
{
attempt++;
if (attempt > failuresBeforeSuccess)
{
status = "success";
break;
}
Console.WriteLine($"retryAfter={attempt}");
}
Console.WriteLine($"attempts={attempt}");
Console.WriteLine($"status={status}");
}
}
failuresBeforeSuccess ← 1, maxAttempts ← 3, attempt ← 0, status ← failed
4{5 static void Main()6 {7 int failuresBeforeSuccess→ 1 = 1; //@failuresBeforeSuccess=0, 38 int maxAttempts→ 3 = 3;9 int attempt→ 0 = 0;10 string status→ failed = "failed";attempt ← 1
pass 1 of 212while (attempt0 < maxAttempts3)13{14 attempt→ 1++;1516 if (attempt > failuresBeforeSuccess)17 {18 status = "success";19 break;20 }2122 Console.WriteLine($"retryAfter={attempt1}");23}outputretryAfter=1attempt ← 2
pass 2 of 212while (attempt1 < maxAttempts3)13{14 attempt→ 2++;status ← success
16if (attempt2 > failuresBeforeSuccess1)17{18 status→ success = "success";19 break;20}Console.WriteLine($"attempts={attempt}");
25 Console.WriteLine($"attempts={attempt2}");26 Console.WriteLine($"status={statussuccess}");27}outputattempts=2 status=success
failuresBeforeSuccess ← 0, maxAttempts ← 3, attempt ← 0, status ← failed
4{5 static void Main()6 {7 int failuresBeforeSuccess→ 0 = 0;8 int maxAttempts→ 3 = 3;9 int attempt→ 0 = 0;10 string status→ failed = "failed";attempt ← 1
12while (attempt0 < maxAttempts3)13{14 attempt→ 1++;status ← success
16if (attempt1 > failuresBeforeSuccess0)17{18 status→ success = "success";19 break;20}Console.WriteLine($"attempts={attempt}");
25 Console.WriteLine($"attempts={attempt1}");26 Console.WriteLine($"status={statussuccess}");27}outputattempts=1 status=success
failuresBeforeSuccess ← 3, maxAttempts ← 3, attempt ← 0, status ← failed
4{5 static void Main()6 {7 int failuresBeforeSuccess→ 3 = 3;8 int maxAttempts→ 3 = 3;9 int attempt→ 0 = 0;10 string status→ failed = "failed";attempt ← 1
pass 1 of 312while (attempt0 < maxAttempts3)13{14 attempt→ 1++;1516 if (attempt > failuresBeforeSuccess)17 {18 status = "success";19 break;20 }2122 Console.WriteLine($"retryAfter={attempt1}");23}outputretryAfter=1All 3 passes — pass 1 is the card above pass attempt1 0 → 1 2 1 → 2 3 2 → 3 Console.WriteLine($"attempts={attempt}");
25 Console.WriteLine($"attempts={attempt3}");26 Console.WriteLine($"status={statusfailed}");27}outputattempts=3 status=failed