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

failuresBeforeSuccess
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}");
    }
}
  1. 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";
  2. attempt ← 1

    pass 1 of 2
    12while (attempt0 < maxAttempts3)13{14    attempt→ 1++;1516    if (attempt > failuresBeforeSuccess)17    {18        status = "success";19        break;20    }2122    Console.WriteLine($"retryAfter={attempt1}");23}
    outputretryAfter=1
  3. attempt ← 2

    pass 2 of 2
    12while (attempt1 < maxAttempts3)13{14    attempt→ 2++;
  4. status ← success

    16if (attempt2 > failuresBeforeSuccess1)17{18    status→ success = "success";19    break;20}
  5. Console.WriteLine($"attempts={attempt}");

    25    Console.WriteLine($"attempts={attempt2}");26    Console.WriteLine($"status={statussuccess}");27}
    outputattempts=2
    status=success
  1. 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";
  2. attempt ← 1

    12while (attempt0 < maxAttempts3)13{14    attempt→ 1++;
  3. status ← success

    16if (attempt1 > failuresBeforeSuccess0)17{18    status→ success = "success";19    break;20}
  4. Console.WriteLine($"attempts={attempt}");

    25    Console.WriteLine($"attempts={attempt1}");26    Console.WriteLine($"status={statussuccess}");27}
    outputattempts=1
    status=success
  1. 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";
  2. attempt ← 1

    pass 1 of 3
    12while (attempt0 < maxAttempts3)13{14    attempt→ 1++;1516    if (attempt > failuresBeforeSuccess)17    {18        status = "success";19        break;20    }2122    Console.WriteLine($"retryAfter={attempt1}");23}
    outputretryAfter=1
    All 3 passes — pass 1 is the card above
    passattempt
    10 1
    21 2
    32 3
  3. Console.WriteLine($"attempts={attempt}");

    25    Console.WriteLine($"attempts={attempt3}");26    Console.WriteLine($"status={statusfailed}");27}
    outputattempts=3
    status=failed