【发布时间】:2016-08-09 18:59:05
【问题描述】:
我有课
class A {
IObservable<long> poll = new Observable.Interval(100 ms).Do((ms) => LoadData());
void Subscribe() {
poll.Subscribe();
}
}
我有课
class B {
IEnumerable<A> Items { get; }
void Refresh() {
Items = GetNewListWithNewJustCreatedInstances();
}
}
用户多次订阅了许多项目,然后他调用 Refresh() 从某个服务器重新加载项目(显然,他再次订阅了新项目)。所有旧订阅都会自动处理吗?还是我应该实现类似的东西?
class A : IDisposable {
void Dispose() {
poll.Dispose();
}
}
class B {
void Refresh() {
foreach (var item in Items) {
item.Dispose();
}
}
}
【问题讨论】:
-
如果您没有要在此处解决的特定问题,只需让垃圾收集器完成其工作即可。
-
@EdPlunkett 我不是要解决问题,我只是担心我的计时器会在我点击 Refresh() 方法后每 100 毫秒继续执行一次,并且每次我点击 Refresh( ) 这些订阅的数量将会增加。因为我不处理 items,所以我只是用 new 项重新创建和重新填充集合(如果用户在某个变量中引用了旧项,我假设它会活着)。
-
这应该很容易测试。如果它一直开火......是的,你需要拍打他们。
-
是的,我想。可惜现在没有测试环境,只有代码:)明天测试。
-
@EdPlunkett - GC 从不调用 dispose。 GC 可能调用一个调用 dispose 的析构函数,但你不能保证它会。您必须明确检查对象是否具有调用 dispose 的析构函数。
标签: c# .net system.reactive disposable