Move data through named stages of an async-style pipeline.

async Pipelines keep each stage small: one step prepares data, the next transforms it, and the final step records the result.

Async Pipeline

example
AsyncPipeline.cs
Replay: real traced execution (multi-file project)
using System;

class Program
{
    static string RunStage(string stage, int value)
    {
        if (stage == "fetch")
        {
            return $"fetched={value}";
        }

        if (stage == "transform")
        {
            return $"transformed={value * 2}";
        }

        return $"saved={value}";
    }

    static void Main()
    {
        string stage = "transform";
        int value = 4;
        string output = RunStage(stage, value);

        Console.WriteLine($"stage={stage}");
        Console.WriteLine(output);
    }
}
using System;

class Program
{
    static string RunStage(string stage, int value)
    {
        if (stage == "fetch")
        {
            return $"fetched={value}";
        }

        if (stage == "transform")
        {
            return $"transformed={value * 2}";
        }

        return $"saved={value}";
    }

    static void Main()
    {
        string stage = "fetch";
        int value = 4;
        string output = RunStage(stage, value);

        Console.WriteLine($"stage={stage}");
        Console.WriteLine(output);
    }
}
using System;

class Program
{
    static string RunStage(string stage, int value)
    {
        if (stage == "fetch")
        {
            return $"fetched={value}";
        }

        if (stage == "transform")
        {
            return $"transformed={value * 2}";
        }

        return $"saved={value}";
    }

    static void Main()
    {
        string stage = "save";
        int value = 4;
        string output = RunStage(stage, value);

        Console.WriteLine($"stage={stage}");
        Console.WriteLine(output);
    }
}
using System;

class Program
{
    static string RunStage(string stage, int value)
    {
        if (stage == "fetch")
        {
            return $"fetched={value}";
        }

        if (stage == "transform")
        {
            return $"transformed={value * 2}";
        }

        return $"saved={value}";
    }

    static void Main()
    {
        string stage = "transform";
        int value = 2;
        string output = RunStage(stage, value);

        Console.WriteLine($"stage={stage}");
        Console.WriteLine(output);
    }
}
using System;

class Program
{
    static string RunStage(string stage, int value)
    {
        if (stage == "fetch")
        {
            return $"fetched={value}";
        }

        if (stage == "transform")
        {
            return $"transformed={value * 2}";
        }

        return $"saved={value}";
    }

    static void Main()
    {
        string stage = "transform";
        int value = 7;
        string output = RunStage(stage, value);

        Console.WriteLine($"stage={stage}");
        Console.WriteLine(output);
    }
}
  1. stage ← transform, value ← 4

    20static void Main()21{22    string stage→ transform = "transform"; //@stage="fetch", "save"23    int value→ 4 = 4; //@value=2, 724    string output = RunStage(stagetransform, value4);
  2. static string RunStage(string stage, int value)

    4{5    static string RunStage(string stagetransform, int value4)6    {7        if (stage == "fetch")
  3. if (stage == "transform")

    12if (stagetransform == "transform")13{14    return $"transformed={value4 * 2}";15}
  4. output ← transformed=8

    23    int value = 4; //@value=2, 724    string output→ transformed=8 = RunStage(stagetransform, value4);2526    Console.WriteLine($"stage={stagetransform}");27    Console.WriteLine(outputtransformed=8);28}
    outputstage=transform
    transformed=8
  1. stage ← fetch, value ← 4

    20static void Main()21{22    string stage→ fetch = "fetch";23    int value→ 4 = 4;24    string output = RunStage(stagefetch, value4);
  2. static string RunStage(string stage, int value)

    4{5    static string RunStage(string stagefetch, int value4)6    {7        if (stage == "fetch")
  3. if (stage == "fetch")

    6{7    if (stagefetch == "fetch")8    {9        return $"fetched={value4}";10    }
  4. output ← fetched=4

    23    int value = 4;24    string output→ fetched=4 = RunStage(stagefetch, value4);2526    Console.WriteLine($"stage={stagefetch}");27    Console.WriteLine(outputfetched=4);28}
    outputstage=fetch
    fetched=4
  1. stage ← save, value ← 4

    20static void Main()21{22    string stage→ save = "save";23    int value→ 4 = 4;24    string output = RunStage(stagesave, value4);
  2. static string RunStage(string stage, int value)

    4{5    static string RunStage(string stagesave, int value4)6    {7        if (stage == "fetch")8        {9            return $"fetched={value}";10        }1112        if (stage == "transform")13        {14            return $"transformed={value * 2}";15        }1617        return $"saved={value4}";18    }
  3. output ← saved=4

    23    int value = 4;24    string output→ saved=4 = RunStage(stagesave, value4);2526    Console.WriteLine($"stage={stagesave}");27    Console.WriteLine(outputsaved=4);28}
    outputstage=save
    saved=4
  1. stage ← transform, value ← 2

    20static void Main()21{22    string stage→ transform = "transform";23    int value→ 2 = 2;24    string output = RunStage(stagetransform, value2);
  2. static string RunStage(string stage, int value)

    4{5    static string RunStage(string stagetransform, int value2)6    {7        if (stage == "fetch")
  3. if (stage == "transform")

    12if (stagetransform == "transform")13{14    return $"transformed={value2 * 2}";15}
  4. output ← transformed=4

    23    int value = 2;24    string output→ transformed=4 = RunStage(stagetransform, value2);2526    Console.WriteLine($"stage={stagetransform}");27    Console.WriteLine(outputtransformed=4);28}
    outputstage=transform
    transformed=4
  1. stage ← transform, value ← 7

    20static void Main()21{22    string stage→ transform = "transform";23    int value→ 7 = 7;24    string output = RunStage(stagetransform, value7);
  2. static string RunStage(string stage, int value)

    4{5    static string RunStage(string stagetransform, int value7)6    {7        if (stage == "fetch")
  3. if (stage == "transform")

    12if (stagetransform == "transform")13{14    return $"transformed={value7 * 2}";15}
  4. output ← transformed=14

    23    int value = 7;24    string output→ transformed=14 = RunStage(stagetransform, value7);2526    Console.WriteLine($"stage={stagetransform}");27    Console.WriteLine(outputtransformed=14);28}
    outputstage=transform
    transformed=14