代码之家  ›  专栏  ›  技术社区  ›  MistyK

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

  •  0
  • MistyK  · 技术社区  · 6 年前

    我想通知订阅的听众 Subject _sub 从另一个可观察到的,然后记录一些信息 Do _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
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   Paulo Morgado    6 年前

    一个被观察者不应该依赖观察者的行为。

    我建议你重新考虑一下。你所做的看起来更具互动性而非被动性。

        2
  •  0
  •   Rajan Mishra M1L0    6 年前

    为了清楚起见,我要回敬保罗:

    • . 虽然可观察对象将等待其同步观察者,但最好将其视为实现的意外。可观察对象根本不等待异步观察者。不管怎样,都不应该依赖等待。

    • 你应该好好想想你是怎么做的。

    • 你的代码乱七八糟 Rx code-smells . 把反应式代码看作一个流程图。你的代码流程图看起来像意大利面。它应该看起来更像一棵二叉树。

    这听起来像是 XY problem

    推荐文章