我有这样一个简单的代码,它:
- 创建 IObservable
- 对其进行 0.5 秒采样
- 使用 ThreadPool 调度程序对其进行订阅
- 使用 SynchronizationContext 进行观察
以下是代码:
private void DisplayPoints()
{
var x = 0;
var ob = this.GeneratePoints();
ob
.Sample(TimeSpan.FromMilliseconds(500))
.SubscribeOn(ThreadPoolScheduler.Instance)
.ObserveOn(SynchronizationContext.Current)
.Subscribe(d => Console.WriteLine(d));
}
private IObservable<double> GeneratePoints()
{
return Observable.Create<double>(o => this.GeneratePoints(o));
}
private IDisposable GeneratePoints(IObserver<double> observer)
{
var i = 0;
while (true)
{
var value = random.Next(0, 100) * (1 / (double)random.Next(1, Math.Min(50, Math.Max(i, 1))));
observer.OnNext(value);
i++;
}
return Disposable.Empty;
}
然而,控制台从未输出任何内容(即匿名观察者从未被调用)。如果我删除
Sample
操作符,观察者会被调用,尽管这显然不是想要的行为(UI线程将会遭受攻击)。我显然在这里缺少了什么。我的意图是生成数据,通过IObserver推送数据,并通过UI显示其中一部分。
编辑:由于有些人误解了我的意图(尽管它们明确陈述在上面),我应该重申一下我要做的事情:
- 使用算法生成一些数据(对于我的问题来说,
double
值似乎已经足够)
- 在GUI中显示数据使用
IObservable
和响应式扩展似乎是解决我的问题的好办法。再次强调:我在真实代码中不会返回随机数 - 这只是一个占位符,以使我的预期行为正常工作。
Observable.Generate
似乎是创建IObservable
更好的方式。我不喜欢这段代码的 "意大利面条式" 结构(虽然添加新行确实有所帮助)。在真正的代码中,我不会返回随机数 - 这只是一个占位符,以使我的预期行为得以实现。 - mnn