using System.Threading.Tasks;
public static async Task Main()
var service = new DummyService();
await service.StartAsync();
private DummyWebSocket _webSocket = new();
public async Task StartAsync()
await _webSocket.StartAsync();
await CreateRetry().ExecuteAsync(
async () => await ReceiveLoopAsync());
Console.WriteLine("Failed after all retries");
public async Task ReceiveLoopAsync()
var result = await _webSocket.ReadAync();
Console.WriteLine(result);
private IAsyncPolicy CreateRetry()
=> Policy.Handle<InvalidOperationException>()
.WaitAndRetryAsync(3, _ => TimeSpan.FromMilliseconds(100),
onRetryAsync: async (ex, ts) =>
await _webSocket.StopAsync();
await _webSocket.StartAsync();
public async Task StartAsync(CancellationToken token = default)
Console.WriteLine("Starting");
await Task.Delay(100, token);
public async Task<string> ReadAync(CancellationToken token = default)
Console.WriteLine("Reading");
await Task.Delay(100, token);
return rnd.Next() % 2 == 1 ? "data" : throw new InvalidOperationException();
public async Task StopAsync(CancellationToken token = default)
Console.WriteLine("Stopping");
await Task.Delay(100, token);