繁体   English   中英

使用Rx .NET从另一个可观察的对象通知异步主题

[英]Notifying asynchronous subject from another observable using Rx .NET

我试图通知从另一个可观察对象订阅Subject _sub侦听器,然后在Do处理程序中记录一些消息。 我正在呼叫OnNext,如果_sub不是异步的,那么一切都会正常进行。 这里的问题是,没有第一个可观察到的OnNextAsync函数。 做这个的最好方式是什么?

 class Program
        {
            private static Subject<int> _sub = new Subject<int>();

            static void Main(string[] args)
            {
                _sub.SelectMany(async _ =>
                {
                    Console.WriteLine("SUB START: " + _);
                    await Task.Delay(3000);
                    Console.WriteLine("SUB END: " + _);
                    return 1;
                }).Subscribe();


                Start();
            }

            public static void Start()
            {
                int count = 0;
                Observable.Interval(TimeSpan.FromSeconds(5)).Select(x =>
                {
                    Console.WriteLine("START INTERVAL");
                    _sub.OnNext(count++); //onNext is not awaitable
                    Console.WriteLine("END INTERVAL");
                    return 1;
                })
                .Do(_ => Console.WriteLine("ALL FINISHED"))
                .Subscribe();

                Console.WriteLine("READLINE");
                Console.ReadLine();
            }

        }

结果:

READLINE
START INTERVAL
SUB START: 0
END INTERVAL
ALL FINISHED
SUB END: 0

预期结果:

READLINE
START INTERVAL
SUB START: 0
SUB END: 0
END INTERVAL
ALL FINISHED

可观察对象不应依赖其观察者的行为。

我建议您重新考虑整个过程。 您正在做的事情看起来比互动更互动。

为了清楚起见,我将回声Paulo:

  • 可观察者不应该在乎观察者 当一个Observable将等待其同步Observer时,最好将其视为实现的偶然事件。 一个Observable根本不会在异步Observer上等待。 无论哪种方式,都不应依靠等待。

  • 您应该重新考虑自己的做法。 您正在使用反应式库来编写交互式代码。 可能是工具选择错误或工具使用不当。

  • 您的代码充满了Rx code-smells 将反应式代码视为流程图。 您的代码流程图看起来像意大利面条。 它看起来应该更像一棵二叉树。

这听起来像是XY问题 :我建议将您要解决的问题改写为新问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM