using System.Threading.Tasks;
class CustomSynchronizationContext : SynchronizationContext { };
static readonly SynchronizationContext context = new CustomSynchronizationContext();
static void SetContextAndTrace(string id)
SynchronizationContext.SetSynchronizationContext(context);
Console.WriteLine($"{id}: {Thread.CurrentThread.ManagedThreadId}");
static async Task GoAsync(bool continueOnCapturedContext)
SetContextAndTrace("G1");
var tcs = new TaskCompletionSource<bool>();
SetContextAndTrace("F1");
.ContinueWith(_ => SetContextAndTrace("F2"), TaskContinuationOptions.ExecuteSynchronously)
.ConfigureAwait(continueOnCapturedContext);
SetContextAndTrace("F3");
SetContextAndTrace("T1");
SetContextAndTrace("T2");
.ContinueWith(_ => SetContextAndTrace("G2"), TaskContinuationOptions.ExecuteSynchronously)
.ConfigureAwait(continueOnCapturedContext);
SetContextAndTrace("G3");
static void RunTest(bool continueOnCapturedContext)
Console.WriteLine(new String('-', 80));
Console.WriteLine($"continueOnCapturedContext: {continueOnCapturedContext}");
SetContextAndTrace("R1");
GoAsync(continueOnCapturedContext).Wait();
SetContextAndTrace("R2");
RunTest(continueOnCapturedContext: false);
RunTest(continueOnCapturedContext: true);