using System.Threading.Tasks;
public static async Task Main()
var result = await GetOpenConnection();
Console.WriteLine(result != null);
static async Task<IMailTransport> GetOpenConnection()
var policy = Policy.Handle<Exception>()
.WaitAndRetryForeverAsync(_ => TimeSpan.FromSeconds(1),
(exception, _) => Console.WriteLine("Could not establish connection"));
return await policy.ExecuteAsync(EstablishConnection);
static async Task<IMailTransport> EstablishConnection()
Console.WriteLine("Get an open connection for SMTP client");
if (counter++ < 4) throw new Exception();
return new DummyMailTransport();
interface IMailTransport { }
class DummyMailTransport: IMailTransport { }