首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >来自IObservable.Subscribe()的IDisposable是否包含对源的引用?

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

Stack Overflow用户
提问于 2012-02-09 05:37:58
回答 3查看 164关注 0票数 1

来自IObservable.Subscribe()IDisposable是否包含对IObservable的引用

如果IDisposable是根的并且不能被垃圾收集,它是否包含对订阅和IObservable的引用

换句话说,如果IObservable的预期生存期比返回的IDisposable的生存期短,那么IObservable可以被GC吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-09 05:45:08

这取决于实现方式。这不是必须的,但它很有可能。

票数 1
EN

Stack Overflow用户

发布于 2012-02-09 06:51:01

我为此创建了一些快速测试代码,似乎IDisposable将保留一个引用并将IObservable保存在内存中。或者至少可以,就像Jason所说的那样。

代码语言:javascript
运行
复制
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‘。

代码语言:javascript
运行
复制
/*IDisposable disposable = */ subject.Subscribe(i => Console.WriteLine("Next: " + i));
票数 0
EN

Stack Overflow用户

发布于 2012-02-09 07:41:40

这里有一个测试,它似乎表明可观察物是GC‘’ed的:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9201866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档