public void TargetsCurrentSynchronizationContext() { RunWithoutSyncCtx(() => { var tsc = new TrackingSynchronizationContext(); SynchronizationContext.SetSynchronizationContext(tsc); Progress<int> p = new Progress<int>(i => { }); for (int i = 0; i < 3; i++) ((IProgress<int>)p).Report(i); Assert.Equal(3, tsc.Posts); SynchronizationContext.SetSynchronizationContext(null); }); }
public void NoWorkQueuedIfNoHandlers() { RunWithoutSyncCtx(() => { var tsc = new TrackingSynchronizationContext(); SynchronizationContext.SetSynchronizationContext(tsc); Progress<int> p = new Progress<int>(); for (int i = 0; i < 3; i++) ((IProgress<int>)p).Report(i); Assert.Equal(0, tsc.Posts); SynchronizationContext.SetSynchronizationContext(null); }); }
public static void SynchronizationContextCurrent_NotUsedForAsyncOperations() { Task.Run(() => { var sc = new TrackingSynchronizationContext(); SynchronizationContext.SetSynchronizationContext(sc); using (XmlReader reader = XmlReader.Create(new DribbleReadXmlAsyncStream(_dummyXml), new XmlReaderSettings { Async = true, })) { while (reader.ReadAsync().GetAwaiter().GetResult()) { ; } } Assert.True(sc.CallStacks.Count == 0, "Sync Ctx used: " + string.Join(Environment.NewLine + Environment.NewLine, sc.CallStacks)); }).GetAwaiter().GetResult(); }
public async Task ConfiguredAwaiter_ContinuesOnCapturedContext(bool continueOnCapturedContext) { await Task.Run(() => { var tsc = new TrackingSynchronizationContext(); SynchronizationContext.SetSynchronizationContext(tsc); try { ValueTask <int> t = new ValueTask <int>(42); var mres = new ManualResetEventSlim(); t.ConfigureAwait(continueOnCapturedContext).GetAwaiter().OnCompleted(() => mres.Set()); Assert.True(mres.Wait(10000)); Assert.Equal(continueOnCapturedContext ? 1 : 0, tsc.Posts); } finally { SynchronizationContext.SetSynchronizationContext(null); } }); }
public async Task ConfiguredAwaiter_ContinuesOnCapturedContext(bool continueOnCapturedContext) { await Task.Run(() => { var tsc = new TrackingSynchronizationContext(); SynchronizationContext.SetSynchronizationContext(tsc); try { ValueTask<int> t = 42; var mres = new ManualResetEventSlim(); t.ConfigureAwait(continueOnCapturedContext).GetAwaiter().OnCompleted(() => mres.Set()); Assert.True(mres.Wait(10000)); Assert.Equal(continueOnCapturedContext ? 1 : 0, tsc.Posts); } finally { SynchronizationContext.SetSynchronizationContext(null); } }); }