处置来自事件的组合可观察量

时间:2016-04-20 14:56:44

标签: c# system.reactive

我正在编写一个套接字服务器,它应该处理从连接到它的每个客户端收到的每条消息。

所有消息都以可观察的方式排队,因此可以在外面订阅和观察。

为确保所有客户端套接字消息都放在同一个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的东西应该完成这项工作,但是怎么做?

1 个答案:

答案 0 :(得分:3)

目前,您不会公开表示内部Observable序列的终止(OnCompleteOnError)。 如果消费者碰巧处理订阅,您允许取消注册事件处理程序,但这是消费者驱动的。

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)