// Copyright Keysight Technologies 2012-2019 // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, you can obtain one at http://mozilla.org/MPL/2.0/. using System.Linq; using System.Threading; namespace OpenTap.Plugins.BasicSteps { [Display("²¢ÐÐ", Group: "Á÷³Ì¿ØÖÆ", Description: "ÔÚ×ÓÏß³ÌÖв¢ÐÐÔËÐÐ×ÓÐòÁÐ", Order: 0)] [AllowAnyChild] public class ParallelStep : TestStep { public override void Run() { TapThread.WithNewContext(Run2); } public void Run2() { var steps = EnabledChildSteps.ToArray(); SemaphoreSlim sem = new SemaphoreSlim(0); var trd = TapThread.Current; Log.Info("Starting {0} child steps in separate threads.", steps.Length); foreach (var _step in steps) { var step = _step; TapThread.Start(() => { try { var run = RunChildStep(step); while (run.SuggestedNextStep == step.Id) { run = RunChildStep(step); } } catch { // no need to do anything. This thread will end now. TapThread.WithNewContext(trd.Abort, null); } finally { sem.Release(); } }); } for (int waits = 0; waits < steps.Length; waits++) sem.Wait(); } } }