调用 subject.OnCompleted() 会清理/调用 dispose/not 泄漏内存还是我必须自己调用 IDisposable 上的 dispose?
Will calling subject.OnCompleted() tidy up/ call dispose/not leak memory or do I have to call dispose on the IDisposable myself?
请问 Rx,调用 subject.OnCompleted() 会清理/调用 dispose / 不会泄漏内存,还是我必须自己调用 return IDisposable 上的 dispose?
基本上我正在制作服务器 request/response 并想知道客户端代码是否需要在下面的示例中调用 replaySubject.Dispose()。
提前致谢。
try
{
object response = Send(msg);
replaySubject.OnNext(response);
}
catch (Exception e)
{
replaySubject.OnError(e);
}
finally
{
replaySubject.OnCompleted();
}
对于 ReplaySubjects
,您应该处理它们以使它们确定性地释放其内部重播缓冲区。请注意,一旦您处理掉它们,任何未来的订阅者都将无法看到重播的事件。因此,如果您仍然需要它们,请不要丢弃它们 "replay"。
如果您不关心确定性,那么只需在它们完成后释放对它们的引用就足够了——当主题被垃圾收集时,它们的缓冲区将被清理。
标准做法规定,如果您负责创建资源,那么您也有责任处置该资源。如果 ReplaySubject
/资源被定义为 class 中的一个字段,那么 class 本身应该实现 IDisposable
。在那个 classes Dispose()
方法中,字段应该依次被处理。如果 ReplaySubject
/resource 是在闭包中定义的(例如在 Observable.Create 中),那么公开一种方法来处理绑定到闭包的资源(可能通过返回 IDisposable
比如 Observable.Create
确实)
同样值得问的问题是,为什么要使用 Subject?你不能只是 .Replay(1)
运算符吗?
请问 Rx,调用 subject.OnCompleted() 会清理/调用 dispose / 不会泄漏内存,还是我必须自己调用 return IDisposable 上的 dispose?
基本上我正在制作服务器 request/response 并想知道客户端代码是否需要在下面的示例中调用 replaySubject.Dispose()。
提前致谢。
try
{
object response = Send(msg);
replaySubject.OnNext(response);
}
catch (Exception e)
{
replaySubject.OnError(e);
}
finally
{
replaySubject.OnCompleted();
}
对于 ReplaySubjects
,您应该处理它们以使它们确定性地释放其内部重播缓冲区。请注意,一旦您处理掉它们,任何未来的订阅者都将无法看到重播的事件。因此,如果您仍然需要它们,请不要丢弃它们 "replay"。
如果您不关心确定性,那么只需在它们完成后释放对它们的引用就足够了——当主题被垃圾收集时,它们的缓冲区将被清理。
标准做法规定,如果您负责创建资源,那么您也有责任处置该资源。如果 ReplaySubject
/资源被定义为 class 中的一个字段,那么 class 本身应该实现 IDisposable
。在那个 classes Dispose()
方法中,字段应该依次被处理。如果 ReplaySubject
/resource 是在闭包中定义的(例如在 Observable.Create 中),那么公开一种方法来处理绑定到闭包的资源(可能通过返回 IDisposable
比如 Observable.Create
确实)
同样值得问的问题是,为什么要使用 Subject?你不能只是 .Replay(1)
运算符吗?