我正在编写一个套接字服务器,它应该处理从连接到它的每个客户端收到的每条消息。
所有消息都以可观察的方式排队,因此可以在外面订阅和观察。
为确保所有客户端套接字消息都放在同一个observable上,我使用了以下代码段:
Public Function getColumn(headerText As String)
str1 = Split(headerText, vbCrLf)
str2 = UBound(str1)
b = Range("1:1").Find(str1(0) & Chr(10) & str1(1)).Column
End Function
现在,我已经检查了内存的(de)分配,问题是即使套接字正确关闭,仍然会在主题中添加相对可观察量的引用;此外,从未调用该事件的注销。
所以,这里有一个问题:有没有办法强制从主题中删除“套接字可观察”?
也许触发套接字observable的OnComplete的东西应该完成这项工作,但是怎么做?
答案 0 :(得分:3)
目前,您不会公开表示内部Observable序列的终止(OnComplete
或OnError
)。
如果消费者碰巧处理订阅,您允许取消注册事件处理程序,但这是消费者驱动的。
在ISocket
接口上是否有任何代表套接字关闭的事件?
如果是这样,您可以在其周围添加Observable.FromEvent
包装器,然后使用该可观察序列终止OnMessage
序列。
var closeObservable = Observable.FromEvent<Action<byte[]>, byte[]>(
action => action.Invoke,
h => socket.OnClose+= h,
h => socket.OnClose -= h);
var msgObservable = Observable.FromEvent<Action<byte[]>, byte[]>(
action => action.Invoke,
h => socket.OnMessage += h,
h => socket.OnMessage -= h);
msgObservable.TakeUntil(closeObservable)