Я изучаю использование 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:
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?