private static void ThrowOnErrors(ParallelizeOption option, ParallelizeCore core) { if (option.FailMode != Fail.Default) { return; } if (core.IsFaulted) { if (core.Exceptions.Count() == 1) { throw core.Exceptions.First(); } throw new AggregateException(core.Exceptions); } if (core.IsCanceled) { throw new TaskCanceledException(); } }
public ParallelizeCore(CancellationToken shutdownCancellationToken, ParallelizeOption options) { _shutdownCancellationRequestToken = shutdownCancellationToken; FailMode = options.FailMode; _globalCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(shutdownCancellationToken, _exceptionCancellationTokenSource.Token); }
public static AsyncStream <TResult> ParallelizeStreamAsync <T, TResult>(this AsyncStream <T> source, Func <T, CancellationToken, Task <TResult> > actionAsync, ParallelizeOption option) { if (actionAsync == null) { throw new ArgumentNullException(nameof(actionAsync)); } return(ParallelizeStreamInternalAsync(source, actionAsync, option)); }
private static AsyncStream <TResult> ParallelizeStreamInternalAsync <T, TResult>(this AsyncStream <T> source, Func <T, CancellationToken, Task <TResult> > actionAsync, ParallelizeOption option) { var core = new ParallelizeCore(source.CancellationToken, option); var monitor = new ParallelMonitor <T>(option.MaxDegreeOfParallelism); var channel = Channel.CreateUnbounded <StreamedValue <TResult> >(); return(new AsyncStream <TResult>(channel, source.CancellationToken, async() => { try { using (core) { await Task.WhenAll(Enumerable.Range(0, option.MaxDegreeOfParallelism) .Select(i => ParallelizeCoreStreamAsync(core, actionAsync, source, channel, i, monitor))); } } catch (Exception e) { channel.Writer.Complete(e); throw; } finally { channel.Writer.Complete(); } ThrowOnErrors(option, core); })); }
public static AsyncStream <TResult> ParallelizeAsync <T, TResult>(this IEnumerable <T> source, Func <T, CancellationToken, Task <TResult> > actionAsync, ParallelizeOption option, CancellationToken cancellationToken) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (actionAsync == null) { throw new ArgumentNullException(nameof(actionAsync)); } return(source.AsAsyncStream(cancellationToken).ParallelizeStreamAsync(actionAsync, option)); }