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

Posted

技术标签:

【中文标题】使用 protobuf-net.Grpc 的客户端回调【英文标题】:Client callbacks with protobuf-net.Grpc 【发布时间】:2020-02-26 18:34:08 【问题描述】:

我目前正在努力用 gRpc 替换旧的 WCF 客户端/服务器配对,并决定使用 protobuf-net.Grpc,因为我们已经在代码库的其他地方广泛使用了 protobuf-net。但是,我在某个特定部分遇到了一些麻烦。

原始服务的一部分是一个订阅方法,它使用 IClientCallback 有效地将事件发送到客户端。查看常规 gRpc,使用服务器流式传输方法并将 IServerStreamWriter 对象存储在服务器上,当我们想要“触发事件”时写入它似乎是可能的(虽然有点 hacky)。

然而,在我的一生中,我无法完全弄清楚如何在 protobuf-net.Grpc 中使用 IAsyncEnumerable 返回类型做类似的事情。我能想到的最接近的是在循环中使用 Task.Wait 并在我想“触发”事件时更新一些共享集合,然后循环将检查并产生返回。然而,这似乎不能很好地扩展,而且当客户端不再监听事件时,也没有一个很好的方法来明确取消订阅。

还有其他/更好的方法吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于使用 protobuf-net.Grpc 的客户端回调的主要内容,如果未能解决你的问题,请参考以下文章

使用 protobuf-net.Grpc 生成通用服务的 .proto 文件

首次使用 protobuf-net c# 访问 gRPC 端点时性能缓慢

对长时间运行的通知通道使用 ServerStreaming rpc 调用

将WCF迁移到gRPC

尝试使用 protobuf-net 序列化 System.Numerics.Quaternion

MySQL客户端使用