using System; using System.Threading.Tasks; class Program { static void Main() { Console.WriteLine("begin"); // なんかどこかで誰かがこんな Post してる気配がなくもない Post(() => { X().Wait(); Console.WriteLine("end"); }); _lastTask.Wait(); } static Task _lastTask = Task.FromResult(null); static void Post(Action continueation) { var t = _lastTask.ContinueWith(_ => continueation()); _lastTask = t; } static Task X() { Console.WriteLine("X1"); var tcs = new TaskCompletionSource(); /* ↓みたいなコードだったとして * await Task.CompletedTask; * await Task.Delay(10); */ Task.CompletedTask.ContinueWith(_1 => { Post(() => { Console.WriteLine("X2"); Task.Delay(10).ContinueWith(_2 => { Post(() => { Console.WriteLine("X3"); tcs.TrySetResult(null); }); }); }); }); return tcs.Task; } }