public async Task TestAB() { //create sequencer ISequencerUC sequencer = SequencerUC.Construct(); //create production code ProductionCode worker = new ProductionCode(sequencer); //register production code sequencer event spots //strategy, one production code event is translated to one unit test code event sequencer .Register(ProductionCode.SequencingEnumTest.SpotBegin, new StrategyOneOnOneUC()) .Register(ProductionCode.SequencingEnumTest.SpotEnd, new StrategyOneOnOneUC()) ; //start concurrent tasks Task.Run(() => { worker.Worker("A"); }); Task.Run(() => { worker.Worker("B"); }); //await two production code events IProductionPointUC taskWorkerBegin1 = await worker.Sequencer.TestPointAsync(ProductionCode.SequencingEnumTest.SpotBegin); IProductionPointUC taskWorkerBegin2 = await worker.Sequencer.TestPointAsync(ProductionCode.SequencingEnumTest.SpotBegin); IProductionPointUC taskWorkerBeginA; IProductionPointUC taskWorkerBeginB; //detect which event is which taskWorkerBeginA = (string)taskWorkerBegin1.ProductionArg == "A" ? taskWorkerBegin1 : null; taskWorkerBeginA = (string)taskWorkerBegin2.ProductionArg == "A" ? taskWorkerBegin2 : taskWorkerBeginA; //detect which event is which taskWorkerBeginB = (string)taskWorkerBegin1.ProductionArg == "B" ? taskWorkerBegin1 : null; taskWorkerBeginB = (string)taskWorkerBegin2.ProductionArg == "B" ? taskWorkerBegin2 : taskWorkerBeginB; //decide about the order of execution taskWorkerBeginA.Complete("A runs first"); //await A to run to SpotB IProductionPointUC taskWorkerEndA = await worker.Sequencer.TestPointAsync(ProductionCode.SequencingEnumTest.SpotEnd); //decide about the order of execution taskWorkerBeginB.Complete("B runs second"); IProductionPointUC taskWorkerEndB = await worker.Sequencer.TestPointAsync(ProductionCode.SequencingEnumTest.SpotEnd); taskWorkerEndA.Complete("A continue"); taskWorkerEndB.Complete("B continue"); }