来自IDisposable
的{{1}}是否持有对IObservable.Subscribe()
的引用?
如果IObservable
已植根并且无法进行垃圾回收,那么它是否包含对订阅的引用以及IDisposable
?
换句话说,如果IObservable
的预期生命周期短于返回的IObservable
的生命周期,那么IDisposable
可以是GC吗?
答案 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