public void DoWork( WorkOrder workOrder ) { this.WorkOrder = workOrder ?? throw new System.ArgumentNullException( "workOrder" ); var steps = ( this.Steps ?? new IStep[ 0 ] ).OfType(); if ( !steps.Any() ) { return; } using ( var tokenSource = new System.Threading.CancellationTokenSource() ) { var token = tokenSource.Token; var maxP = this.MaxDegreeOfParallelism; if ( DefaultMaxDegreeOfParallelism == maxP ) { this.DoUnlimitedWork( workOrder, steps, token ); } else { this.DoLimitedWork( workOrder, steps, token, maxP ); } } } private void DoUnlimitedWork( WorkOrder workOrder, System.Collections.Generic.IEnumerable steps, System.Threading.CancellationToken token ) { System.Collections.Generic.ICollection tasks = new System.Collections.Generic.List(); var factory = new System.Threading.Tasks.TaskFactory( token, System.Threading.Tasks.TaskCreationOptions.LongRunning, System.Threading.Tasks.TaskContinuationOptions.LongRunning, System.Threading.Tasks.TaskScheduler.Default ); foreach ( var step in steps ) { tasks.Add( factory.StartNew( () => step.DoWork( workOrder ), token ) ); } System.Threading.Tasks.Task.WaitAll( tasks.ToArray(), token ); } private void DoLimitedWork( WorkOrder workOrder, System.Collections.Generic.IEnumerable steps, System.Threading.CancellationToken token, System.Int32 MaxDegreeOfParallelism ) { using ( var semaphore = new Semaphore( this.MaxDegreeOfParallelism, this.MaxDegreeOfParallelism ) ) { System.Collections.Generic.ICollection tasks = new System.Collections.Generic.List(); var factory = new System.Threading.Tasks.TaskFactory( token ); foreach ( var step in steps ) { tasks.Add( factory.StartNew( () => { semaphore.Wait(); step.DoWork( workOrder ); semaphore.Release(); }, token ) ); } System.Threading.Tasks.Task.WaitAll( tasks.ToArray(), token ); } }