using System.Threading.Tasks;
private object _lock = new object ();
bool _reRunTriggered = false;
public async Task EnsureRunThingsAsync(bool overrideRunLock = false)
if (!EnterLocked(overrideRunLock))
Console.WriteLine("run again because rerun requested");
await EnsureRunThingsAsync(true);
private bool EnterLocked(bool overrideRunLock)
if (_isRunning && !overrideRunLock)
Console.WriteLine("locked > early exit, request rerun");
Console.WriteLine("run function");
public static async Task Main()
var t1 = r.EnsureRunThingsAsync();
var t2 = r.EnsureRunThingsAsync();
await Task.WhenAll(t1, t2);