using System.Runtime.CompilerServices;
using System.Threading.Tasks;
public class ExecutionContextFlowTests
private class TestSynchronizationContext : SynchronizationContext
public override SynchronizationContext CreateCopy()
return new TestSynchronizationContext();
public override bool Equals(object obj)
return obj is TestSynchronizationContext;
public override int GetHashCode()
var syncCtx = new TestSynchronizationContext();
Task<ExecutionContext> t;
using (ExecutionContext.SuppressFlow())
SynchronizationContext prevCtx = SynchronizationContext.Current;
SynchronizationContext.SetSynchronizationContext(syncCtx);
return ExecutionContext.Capture();
SynchronizationContext.SetSynchronizationContext(prevCtx);
ExecutionContext capturedContext = await t.ConfigureAwait(false);
Assert.That(capturedContext, Is.Not.Null);
Assert.That(SynchronizationContext.Current, Is.Not.EqualTo(syncCtx));
var syncCtxBox = new StrongBox<SynchronizationContext>();
box => ((StrongBox<SynchronizationContext>)box).Value = SynchronizationContext.Current,
Assert.That(syncCtxBox.Value, Is.EqualTo(syncCtx));
public static class Program
new ExecutionContextFlowTests().Test().GetAwaiter().GetResult();
Console.WriteLine("Test failed: {0}", ex);
Console.WriteLine("Test passed");