【问题标题】:Will calling subject.OnCompleted() tidy up/ call dispose/not leak memory or do I have to call dispose on the IDisposable myself?调用 subject.OnCompleted() 是否会整理/调用 dispose/不泄漏内存,还是我必须自己在 IDisposable 上调用 dispose?
【发布时间】:2015-03-06 11:48:19
【问题描述】:

Rx 问题,请调用 subject.OnCompleted() 整理/调用 dispose/不泄漏内存,还是我必须自己在返回 IDisposable 时调用 dispose?

基本上,我正在发出服务器请求/响应,并想知道客户端代码是否需要在下面的示例中调用 replaySubject.Dispose()。

提前致谢。

            try
            {
                object response = Send(msg);
                replaySubject.OnNext(response);
            }
            catch (Exception e)
            {
                replaySubject.OnError(e);
            }
            finally
            {
                replaySubject.OnCompleted();
            }

【问题讨论】:

标签: c# system.reactive


【解决方案1】:

对于ReplaySubjects,您应该处理它们以让它们确定性地释放其内部重放缓冲区。请注意,一旦您处理掉它们,任何未来的订阅者都将无法看到重播的事件。因此,如果您仍然需要它们“重播”,请不要丢弃它们。

如果您不关心确定性,那么在它们完成后释放对它们的引用就足够了——当主题被垃圾收集时,它们的缓冲区将被清理。

【讨论】:

    【解决方案2】:

    标准做法规定,如果您负责创建资源,则您负责处置该资源。如果ReplaySubject/resource 被定义为类中的一个字段,那么类本身应该实现IDisposable。在该类Dispose() 方法中,该字段应依次被处置。如果ReplaySubject/resource 是在闭包中定义的(例如在 Observable.Create 中),则公开一种方法来处理绑定到闭包的资源(可能通过返回 IDisposable 就像 Observable.Create 一样)

    同样值得问一个问题,你为什么使用主题?你不能只使用.Replay(1) 运算符吗?

    【讨论】:

    • Replay(1) 在哪里?
    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 2015-09-07
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多