【发布时间】:2014-02-26 23:43:13
【问题描述】:
我有这个简单的代码,其中:
- 创建 IObservable
- 采样半秒
- 使用 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 和响应式扩展似乎是解决我的问题的好方法。
再重复一遍:我不会在实际代码中返回随机数 - 这只是一个占位符 让我的预期行为发挥作用。
【问题讨论】:
标签: c# system.reactive