IObservable.Subscribe()中的IDisposable是否包含对源的引用?

时间:2012-02-08 21:37:58

标签: .net system.reactive

来自IDisposable的{​​{1}}是否持有对IObservable.Subscribe()的引用?

如果IObservable已植根并且无法进行垃圾回收,那么它是否包含对订阅的引用以及IDisposable

换句话说,如果IObservable的预期生命周期短于返回的IObservable的生命周期,那么IDisposable可以是GC吗?

3 个答案:

答案 0 :(得分:1)

这取决于实施。它没有,但它很可能。

答案 1 :(得分:0)

我为此创建了一些快速测试代码,似乎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。

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

答案 2 :(得分:0)

这是一个似乎表明观察者是GC的测试:

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