public void CaptureContextNoSyncContextTest() { var originalContext = SynchronizationContext.Current; var syncContext = new CustomSyncContext(); try { SynchronizationContext.SetSynchronizationContext(syncContext); var eContext = ExecutionContextHelper.CaptureContextNoSyncContextIfPossible(); Assert.IsNotNull(eContext); AtomicBool isDefaulContext = new AtomicBool(false); var task = Task.Run(() => { SynchronizationContext.SetSynchronizationContext(null); ExecutionContextHelper.RunInContext(eContext, (st) => { isDefaulContext.Value = SynchronizationContext.Current == null; }, null, true); }); task.Wait(); TimingAssert.IsTrue(10000, isDefaulContext, "Default context expected"); } finally { SynchronizationContext.SetSynchronizationContext(originalContext); } }
private void RunCommon() { syncContext = new CustomSyncContext(this); SynchronizationContext.SetSynchronizationContext(syncContext); try { Loop(); runDeferred.SetResult(true); } catch (Exception ex) { runDeferred.SetException(ex); } finally { if (runMode) { runTask = runDeferred.Task; } runDeferred = null; } }
public void RegisterWithoutECTest() { var originalContext = SynchronizationContext.Current; var syncContext = new CustomSyncContext(); try { CancellationTokenSource tokenSource = new CancellationTokenSource(); CancellationToken token = tokenSource.Token; AtomicBool isNoExecutionContext = new AtomicBool(false); using (CancellationTokenHelper.RegisterWithoutECIfPossible(token, (st) => { isNoExecutionContext.Value = SynchronizationContext.Current == null; }, null)) { Barrier barrier = new Barrier(2); Barrier barrier2 = new Barrier(2); Task.Run(() => { barrier.SignalAndWait(); barrier2.SignalAndWait(); tokenSource.Cancel(); }); barrier.SignalAndWait(); SynchronizationContext.SetSynchronizationContext(syncContext); barrier2.SignalAndWait(); TimingAssert.IsTrue(10000, isNoExecutionContext, "isNoExecutionContext"); } } finally { SynchronizationContext.SetSynchronizationContext(originalContext); } }
/// <summary> /// Creates a new time model, optionally providing a starting time and increment /// </summary> /// <param name="increment">The amount of time to increment on each iteration, defaults to one 100 nanosecond tick</param> /// <param name="now">The starting time, defaults to zero</param> public Time(TimeSpan?increment = null, TimeSpan?now = null) { Increment = increment.HasValue ? increment.Value : TimeSpan.FromTicks(1); Now = now.HasValue ? now.Value : TimeSpan.Zero; syncContext = new CustomSyncContext(this); }