调用subject.OnCompleted()会整理/调用dispose/不会泄漏内存,还是我需要自己调用IDisposable的dispose方法?

3
请问Rx,如果我调用subject.OnCompleted()会清理/调用Dispose/不泄漏内存吗?还是我需要自己调用返回的IDisposable来释放资源?
基本上,我正在进行服务器请求/响应,并想知道客户端代码是否需要在下面的示例中调用replaySubject.Dispose()。
提前感谢。
            try
            {
                object response = Send(msg);
                replaySubject.OnNext(response);
            }
            catch (Exception e)
            {
                replaySubject.OnError(e);
            }
            finally
            {
                replaySubject.OnCompleted();
            }

请查看"Should questions include “tags” in their titles?",共识是"不应该包含标签"! - user57508
2个回答

0
对于ReplaySubjects,您应该处理它们以确定性地释放其内部重放缓冲区。请注意,一旦您处理它们,任何未来的订阅者都将无法看到重放的事件。因此,如果您仍需要它们进行“重放”,请勿处理它们。
如果您不关心确定性,则在它们完成后释放对它们的引用就足够了——当这些主题被垃圾回收时,它们的缓冲区将被清除。

0

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

另外值得问一下,为什么要使用Subject?难道您不能只使用.Replay(1)运算符吗?


Replay(1) 在哪里? - Daniel Gomez Rico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接