public async Task AddCompletionCallback_ContinuationsRunOnCorrectSynchronozationContext() { // Arrange var op = new AsyncCompletionSource(); var op2 = new AsyncCompletionSource(); var sc = Substitute.For <SynchronizationContext>(); var tid = 0; var tidActual = 0; op.AddCompletionCallback(new Action(() => { }), sc); op2.AddCompletionCallback(new Action(() => tidActual = Thread.CurrentThread.ManagedThreadId), null); // Act await Task.Run(() => op.SetCompleted()); await Task.Run(() => { tid = Thread.CurrentThread.ManagedThreadId; op2.SetCompleted(); }); // Assert sc.Received(1).Post(Arg.Any <SendOrPostCallback>(), Arg.Any <object>()); Assert.Equal(tid, tidActual); }