来自IObservable.Subscribe()的IDisposable是否包含对IObservable的引用
如果IDisposable是根的并且不能被垃圾收集,它是否包含对订阅和IObservable的引用
换句话说,如果IObservable的预期生存期比返回的IDisposable的生存期短,那么IObservable可以被GC吗?
发布于 2012-02-09 05:45:08
这取决于实现方式。这不是必须的,但它很有可能。
发布于 2012-02-09 06:51:01
我为此创建了一些快速测试代码,似乎IDisposable将保留一个引用并将IObservable保存在内存中。或者至少可以,就像Jason所说的那样。
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));发布于 2012-02-09 07:41:40
这里有一个测试,它似乎表明可观察物是GC‘’ed的:
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); // Falsehttps://stackoverflow.com/questions/9201866
复制相似问题