/// <summary> /// Generates an optional step with the given number of threads. /// </summary> /// <param name="inDegreeOfParallism">How many threads should be available for this step.</param> /// <typeparam name="TOptionalInOut">The In- and Output type of this step.</typeparam> public OptionalPipelineStep <TOptionalInOut, TOptionalInOut> GenerateOptionalStep <TOptionalInOut>(int inDegreeOfParallism) { var pipelineStep = new OptionalPipelineStep <TOptionalInOut, TOptionalInOut>(); var stepIndex = PipelineSteps.Count; for (int i = 0; i < inDegreeOfParallism; i++) { Task.Run(() => { StartOptionalStep <TOptionalInOut>(stepIndex, pipelineStep); }); } PipelineSteps.Add(pipelineStep); return(pipelineStep); }
/// <summary> /// Processes the optional step. /// </summary> /// <param name="inStepIndex">The index of this step in the pipeline.</param> /// <param name="inOptionalStep">The optional step being processed.</param> /// <typeparam name="TOptionalInOut">The In and Output type of the optional step.</typeparam> private void StartOptionalStep <TOptionalInOut>(int inStepIndex, OptionalPipelineStep <TOptionalInOut, TOptionalInOut> inOptionalStep) { IPipelineStep <TOptionalInOut> nextPipelineStep = null; foreach (var input in inOptionalStep.Buffer.GetConsumingEnumerable()) { TOptionalInOut output = default(TOptionalInOut); try { if (inOptionalStep.Choice(input.Input)) { output = inOptionalStep.StepAction(input.Input); } } catch (Exception e) { input.TaskCompletionSource.SetException(e); continue; } FinishStep(input, output, inStepIndex, ref nextPipelineStep); } }