private IEnumerable <OperationResult> ProcessSerial( FaultCancellationOption faultCancellationOption, IEnumerable <OperationArgument> arguments, IEnumerable <IOperationExecutor> executors) { var results = new List <OperationResult>(); foreach (var executor in executors) { try { executor.Execute(GetOperationExecutionContext(arguments, results, CancellationToken.None)); } catch (Exception ex) { results.Add(GetFaultedOperationResult(executor.SupportedOperationName, ex)); } if (faultCancellationOption == FaultCancellationOption.Cancel && results.Any(x => x.IsFaulted)) { break; } } return(results); }
private IEnumerable <OperationResult> ProcessParallel( FaultCancellationOption faultCancellationOption, IEnumerable <OperationArgument> arguments, IEnumerable <IOperationExecutor> executors) { var results = new List <OperationResult>(); var cancellationTokenSource = new CancellationTokenSource(); var mainThreadHttpContext = HttpContext.Current; var parallelOptions = GetParallelOptions(cancellationTokenSource); try { Parallel.ForEach(executors, parallelOptions, (executor, state) => { try { HttpContext.Current = mainThreadHttpContext; if (!parallelOptions.CancellationToken.IsCancellationRequested) { executor.Execute(GetOperationExecutionContext(arguments, results, parallelOptions.CancellationToken)); } } catch (Exception ex) { if (faultCancellationOption == FaultCancellationOption.Cancel) { cancellationTokenSource.Cancel(); } results.Add(GetFaultedOperationResult(executor.SupportedOperationName, ex)); } }); } catch { } // do nothing, as each task in parallel handles exception, and exception is returned back to client. finally { cancellationTokenSource.Dispose(); } return(results); }