我在理解Observable.Delay如何工作以及何时调用Dispose()时遇到问题。任何熟悉Rx的人都能帮忙吗?
以下代码段:
static void Main(string[] args)
{
var oneNumberEveryFiveSeconds = new SomeObservable();
// Instant echo
oneNumberEveryFiveSeconds.SubscribeOn(Scheduler.ThreadPool).Subscribe(num => Console.WriteLine(num));
// One second delay
oneNumberEveryFiveSeconds.Delay(TimeSpan.FromSeconds(1)).SubscribeOn(Scheduler.ThreadPool).Subscribe(num => Console.WriteLine("...{0}...", num));
// Two second delay
oneNumberEveryFiveSeconds.Delay(TimeSpan.FromSeconds(2)).SubscribeOn(Scheduler.ThreadPool).Subscribe(num => Console.WriteLine("......{0}......", num));
Console.ReadKey();
}
public class SomeObservable : IObservable<int>
{
public IDisposable Subscribe(IObserver<int> o)
{
for (var i = 0; i < 2; i++)
{
o.OnNext(i);
}
o.OnCompleted();
return new DisposableAction(() => { Console.WriteLine("DISPOSED"); });
}
}
public class DisposableAction : IDisposable
{
public DisposableAction(Action dispose)
{
this.dispose = dispose;
}
readonly Action dispose;
public void Dispose()
{
dispose();
}
}
产生以下结果:
0
1
配置
配置
配置
... 0 ...
... 1 ...
...... 0 ......
...... 1 ......
我原以为它更像是:
0
1
配置
... 0 ...
... 1 ...
配置
...... 0 ......
...... 1 ......
设置
任何想法??
答案 0 :(得分:2)
Rx的标准功能是在序列完成时处理订阅(即使其值仍然通过另一个序列传送)。
考虑到这一点,Delay
无法控制从源序列发出的值的速度,它只能将值延迟到自己的观察者。
答案 1 :(得分:0)
如果我不得不猜测我会说延迟排队来自原始观察点的物品,然后根据指定的延迟按照它认为合适的方式发送它们。因此,即使原始的可观察性早已被处理,延迟方法创建的可观察性仍然存在并且仍然存在。你正在观察的行为非常适合这种解释。
答案 2 :(得分:-1)
没有ThreadPool,行为是相同的:
0 1 配置 配置 ... 0 ... ... 1 ... ...... 0 ...... ...... 1 ......