Exemple #1
0
            internal bool TryConnect(
                IPublisher <T> source,
                Action <IDisposable> action,
                Func <IProcessor <T, T> > processorSupplier,
                Func <IFlux <T>, IPublisher <U> > selector)
            {
                if (Volatile.Read(ref done) != 0)
                {
                    return(false);
                }
                if (Interlocked.CompareExchange(ref once, 1, 0) == 0)
                {
                    try
                    {
                        processor = processorSupplier();

                        result = selector(Flux.Wrap(processor));
                    }
                    catch (Exception ex)
                    {
                        ExceptionHelper.ThrowIfFatal(ex);
                        Volatile.Write(ref done, 1);
                        foreach (var s in subscribers.Terminate())
                        {
                            EmptySubscription <U> .Error(s, ex);
                        }
                        return(false);
                    }

                    foreach (var s in subscribers.Terminate())
                    {
                        result.Subscribe(s);
                    }

                    action?.Invoke(this);

                    source.Subscribe(this);
                }
                return(true);
            }