using System.Collections.Generic;
using System.Threading.Tasks;
public async Task EnsureRunThingsExchangeAsync()
if (Interlocked.Increment(ref syncNum) > 1)
Console.WriteLine("request rerun return");
Interlocked.Exchange(ref syncNum, 1);
await ActualRunThingsAsync();
while (Interlocked.Decrement(ref syncNum) != 0);
Console.WriteLine("end");
public async Task EnsureRunThingsExchangeAsyncFlawed()
if (Interlocked.Increment(ref syncNum) > 1)
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} increment return");
await ActualRunThingsAsync();
while (Interlocked.Exchange(ref syncNum, 0) > 0);
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} end");
public async Task ActualRunThingsAsync()
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} ActualRunThingsAsync");
public static async Task Main()
await Task.WhenAll(r.EnsureRunThingsExchangeAsync()
,r.EnsureRunThingsExchangeAsync()
,r.EnsureRunThingsExchangeAsync()
,r.EnsureRunThingsExchangeAsync()