我正在调查使用Observable.Generate创建按间隔采样的结果序列的用法,以msdn网站上的示例为起点。
以下代码没有TimeSpan选择器,不会出现内存泄漏:
IObservable<string> obs = Observable.Generate(initialState: 1,
condition: x => x < 1000,
iterate: x => x + 1,
resultSelector: x => x.ToString());
obs.Subscribe(x => Console.WriteLine(x));
然而,带有 TimeSpan 选择器的以下代码会导致内存泄漏:
TimeSpan timeSpan = TimeSpan.FromSeconds(1);
IObservable<string> obs = Observable.Generate(initialState: 1,
condition: x => x < 1000,
iterate: x => x + 1,
resultSelector: x => x.ToString(),
timeSelector: x => timeSpan);
obs.Subscribe(x => Console.WriteLine(x));
例如,这个玩具应用程序将快速显示使用 VS 2015 社区版本附带的内存分析器显示的内存泄漏情况:using System;
using System.Reactive.Linq;
namespace Sample
{
public class Program
{
static void Main()
{
IObservable<string> obs = Observable.Generate(1, x => x < 1000*1000, x => x + 1, x => x.ToString(), x => TimeSpan.FromMilliseconds(500));
obs.Subscribe(x => { /*Do nothing but simply run the observable*/ });
Console.ReadLine();
}
}
}
内存泄漏是不断增长的一组:
System.Reactive.Disposables StableCompositeDisposable.Binary
System.Reactive.Disposables SingleAssignmentDisposable
我是否使用这个API有误? 我应该期望内存增长吗?还是这是Reactive的一个bug?
Observable
是否在事件处理程序中构建? - supertopitimeSpan
声明的位置。 - Jeroen van Langen