收集中的一次性物品是否应在收集后重新处理?

时间:2016-08-09 18:59:06

标签: c# .net system.reactive disposable

我有课

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();
        }
    }
}

1 个答案:

答案 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

当内存泄漏行被取消注释并且安全版被注释时,您将看到每个间隔弹出三个数字,每个订阅一个。当一次性跟踪线被取消注释并且内存泄漏被注释掉时,您应该看不到输出。