我有课
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();
}
}
}
答案 0 :(得分:0)
您的代码是多个内存泄漏的秘诀。见similar question。
Rx订阅永远保持活跃状态,直到被处理,OnComplete调用或OnError。垃圾收集不会清理它们。由于您没有处置,并且@Mojo (name = "run-custom-tests", LifecyclePhase.TEST)
public class TesterMojo extends AbstractMojo {
@Parameter(property = "someParameter")
private String someParameter;
// [...] parameters for test configuration
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
// Piece of code that executes a set of custom tests which procedure I specified.
}
}
永远不会完成,因此每个订阅都会泄漏,直到您的内存不足为止。您的代码为每个Observable.Interval
实例提供了多个订阅的可能性,显然还有多个A
个对象。
这是一些测试它的Linqpad友好代码:
A
当内存泄漏行被取消注释并且安全版被注释时,您将看到每个间隔弹出三个数字,每个订阅一个。当一次性跟踪线被取消注释并且内存泄漏被注释掉时,您应该看不到输出。