Содержит ли IDisposable из IObservable.Subscribe () ссылку на источник? - PullRequest
1 голос
/ 09 февраля 2012

Содержит ли IDisposable из IObservable.Subscribe() ссылку на IObservable?

Если IDisposable имеет корни и не может быть удален для сбора мусора, содержит ли он ссылку на подпискуи IObservable?

Другими словами, если предполагаемое время жизни IObservable короче, чем время жизни возвращенного IDisposable, может ли IObservable быть GC'ed?

Ответы [ 3 ]

1 голос
/ 09 февраля 2012

Это зависит от реализации.Это не обязательно, но вполне может.

0 голосов
/ 09 февраля 2012

Вот тест, который, кажется, показывает, что наблюдаемое - это GC: * ​​1001 *

var xs = Observable.Timer(TimeSpan.FromSeconds(1.0));
var disposable = xs.Subscribe(x => Console.WriteLine(x));

var wr = new WeakReference(xs);
xs = null;

Thread.Sleep(2000);

Console.WriteLine(wr.IsAlive); // True

GC.Collect();

Console.WriteLine(wr.IsAlive); // False
0 голосов
/ 09 февраля 2012

Я создал несколько быстрых тестовых кодов для этого, и, похоже, IDisposable сохранит ссылку и удержит IObservable в памяти. Или, по крайней мере, очень хорошо, как говорит Джейсон.

Subject<int> subject = new Subject<int>();
WeakReference wr = new WeakReference(subject);

IDisposable disposable = subject.Subscribe(i => Console.WriteLine("Next: " + i));

subject.OnNext(5);
subject.OnNext(10);
subject = null;

GC.Collect();
Console.WriteLine(wr.IsAlive ? "Subject is still alive." : "Subject is not alive.");

Когда написано, как указано выше, слабая ссылка все еще будет жива. Если я закомментирую одноразовое назначение, то subject получает GC'ed.

/*IDisposable disposable = */ subject.Subscribe(i => Console.WriteLine("Next: " + i));
...