Observable.Generate с TimeSpan селектор, похоже, утечка памяти [При использовании TimeSpan> 15 мс]
Я исследую использование 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));
Например, это игрушечное приложение быстро покажет утечку памяти с помощью Memory Profiler, который поставляется с VS 2015 Community:
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?