using System.Threading.Tasks;
namespace ConsoleApplication
static async Task TestAsync()
Console.WriteLine("Enter TestAsync");
var awaiter = new Awaiter();
Console.WriteLine("tick: " + i++);
Console.WriteLine("Exit TestAsync");
public static void Main(string[] args)
Console.WriteLine("Press Enter to exit...");
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
System.Runtime.CompilerServices.INotifyCompletion
Console.WriteLine("Awaiter()");
Console.WriteLine("~Awaiter()");
var continuation = Interlocked.Exchange(ref _continuation, null);
if (continuation != null)
public Awaiter GetAwaiter()
public void OnCompleted(Action continuation)
Volatile.Write(ref _continuation, continuation);