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);
        }
コード例 #2
0
        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;
        }
コード例 #3
0
        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");
        }