使用 protobuf-net.Grpc 的客户端回调

Client callbacks with protobuf-net.Grpc

我目前正在努力用 gRpc 替换旧的 WCF client/server 配对,并决定使用 protobuf-net.Grpc,因为我们在代码库的其他地方广泛使用了 protobuf-net。然而,我 运行 在某一特定部分遇到了一些麻烦。

原始服务的一部分是订阅方法,它使用 IClientCallback 有效地将事件发送到客户端。看看常规的 gRpc,这似乎是可能的(虽然有点 hacky)使用服务器流方法并将 IServerStreamWriter 对象存储在服务器上,每当我们想要 "fire an event".

时写入它

然而,对于我来说,我不太明白如何在 protobuf-net.Grpc 中使用 IAsyncEnumerable return 类型做类似的事情。我能想到的最接近的是在循环中使用 Task.Wait 并在我想要 "fire" 事件时更新一些共享集合,然后循环将检查并产生 return。然而,这似乎不能很好地扩展,并且当客户不再收听事件时,也没有真正取消订阅的好方法。

有什么other/better方法可以做到这一点吗?

Channel<T>,可以通过 AsAsyncEnumerable() 进行调整 - 然后本质上在生产者端充当队列,在消费者端充当序列。