【发布时间】:2014-10-08 17:22:21
【问题描述】:
这不是现实生活中的例子(这段代码可能无法编译),但我试图让它比我实际遇到的问题简单一点。
假设我有图像集合:
private void IEnumerable<Image> GetImages()
{
foreach (var filename in GetFilenames())
{
yield return Image.LoadFile(filename);
}
}
我想显示由用户按“空格”驱动的幻灯片:
var images = Observable.FromEvent(form, "KeyPress")
.Where(e => e.KeyCode == KeyCode.Space)
.Zip(GetImages.ToObservable(), (k, i) => i);
而且这种作品。当按下空格时,它会发出下一张图像。问题是它实际上以全速加载它们,因此它们被缓冲并消耗大量内存(以及加载时的处理能力)。 我可以将过滤后的按键输入 GetImages 和那里的压缩,但我不会保留 GetImages 的纯度。
有什么方法可以防止在不需要的情况下提前枚举 enumerable.ToObservable()?
另一个例子(这个会编译):
var observable =
Observable.Interval(TimeSpan.FromSeconds(1))
.Zip(
Observable.Range(0, 1000000).Do(x => Console.WriteLine("produced {0}", x)),
(_, v) => v
);
var subscription = observable.Subscribe(x => Console.WriteLine("consumed {0}", x));
Console.WriteLine("Press <enter>...");
Console.ReadLine();
它会(提前)生成很多“已生产”,但每秒只会“消耗”一个。
【问题讨论】:
标签: c# system.reactive