public void CreateCopy_ReturnsNewInstance() { var syncContext = new SingleThreadedSynchronizationContext(); var other = syncContext.CreateCopy(); Assert.NotSame(syncContext, other); // Verify that posting to the copy effectively gets the work to run on the original thread. var frame = new SingleThreadedSynchronizationContext.Frame(); int?observedThreadId = null; Task.Run(() => { other.Post( s => { observedThreadId = Environment.CurrentManagedThreadId; frame.Continue = false; }, null); }); syncContext.PushFrame(frame); Assert.Equal(Environment.CurrentManagedThreadId, observedThreadId.Value); }
public void Send_OnDifferentThread_ExecutesDelegateAndWaits() { int originalThreadId = Environment.CurrentManagedThreadId; var syncContext = new SingleThreadedSynchronizationContext(); var frame = new SingleThreadedSynchronizationContext.Frame(); var task = Task.Run(delegate { try { int?observedThreadId = null; syncContext.Send(s => observedThreadId = Environment.CurrentManagedThreadId, null); Assert.Equal(originalThreadId, observedThreadId); } finally { frame.Continue = false; } }); syncContext.PushFrame(frame); task.GetAwaiter().GetResult(); }