将调用subject.OnCompleted()整理/调用dispose / not leak memory或者我是否必须在IDisposable上调用dispose?

时间:2015-03-06 11:48:20

标签: c# system.reactive

请问Rx问题,是否会调用subject.OnCompleted()整理/调用dispose / not leak memory或者我必须在返回IDisposable上调用dispose吗?

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

提前致谢。

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

2 个答案:

答案 0 :(得分:0)

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

如果你不关心确定性,那么只要在它们完成后释放对它们的引用就足够了 - 当对象被垃圾收集时,它们的缓冲区将被清除。

答案 1 :(得分:0)

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

还值得问一个问题,你为什么要使用主题?你能不只是{{1}}运营商吗?