[英]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.