TestPointCompleteAsync <TEnum>(this ISequencerUC sequencer, TEnum registration, object testArg = null, SeqContinuationUC context = SeqContinuationUC.OnCapturedContext) where TEnum : struct { IProductionPointUC prodPoint = await sequencer.TestPointAsync(registration); prodPoint?.Complete(testArg, context); return(prodPoint); }
public void Complete(object testArg = null, SeqContinuationUC context = SeqContinuationUC.OnCapturedContext) { if (Interlocked.CompareExchange(ref _completed, 1, 0) == 0) //allow completion only once { if (SeqPointType == SeqPointTypeUC.Match) { PostContinuation(context, testArg); //handles SetCompletion(); return; } SetCompletion(); return; } Exception ex = new InvalidOperationException($"{nameof(ProductionPointUC)}: Calling {nameof(Complete)} or {nameof(Fail)} multiple times!"); ExceptionRegister.RegisterException(ex); throw ex; }
private void PostContinuation(SeqContinuationUC context, object testArg) { Task t; if (context == SeqContinuationUC.OnCapturedContext) { if (SynchronizationContext != null) { SynchronizationContext.OperationStarted(); SynchronizationContext.Post(ExecuteContinuation, testArg); return; } if (TaskScheduler != null) { t = Task.Factory.StartNew(ExecuteContinuation, testArg, CancellationToken.None, SafeStartNewOptions(), TaskScheduler); TaskRegister.RegisterTask(t); return; } Trace.WriteLine("Unknown synchronization context, defaulting to TaskScheduler.Default!"); t = Task.Factory.StartNew(ExecuteContinuation, testArg, CancellationToken.None, SafeStartNewOptions(), TaskScheduler.Default); TaskRegister.RegisterTask(t); return; } if (context == SeqContinuationUC.OnNewContext) { t = Task.Factory.StartNew(ExecuteContinuation, testArg, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default); TaskRegister.RegisterTask(t); return; } if (context == SeqContinuationUC.OnCallersContext) { ExecuteContinuation(testArg); } throw new InvalidOperationException($"{nameof(PostContinuation)} did not captured any context in production code"); }