Exemple #1
0
        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);
 }
Exemple #3
0
        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));
        }
Exemple #4
0
        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);
            }));
        }
Exemple #5
0
        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));
        }