我目前正在用gRpc替换旧的WCF客户端/服务器配对,并决定使用protobuf-net.Grpc,因为我们在代码库的其他地方广泛使用了protobuf-net。但是我在一个特定的部分上遇到了麻烦。
原始服务的一部分是Subscribe方法,该方法使用IClientCallback有效地将事件发送到客户端。看看常规的gRpc,似乎可以使用服务器流方法并将IServerStreamWriter对象存储在服务器上,只要我们想“触发事件”就可以写入(尽管有点怪异)。
但是,对于我自己的一生,我还不太清楚如何在IAsyncEnumerable返回类型的protobuf-net.Grpc中执行类似的操作。我能想到的最接近的是在循环中使用Task.Wait并在我要“触发”事件时更新一些共享集合,然后循环将检查并产生回报。但是,这似乎没有很好的扩展性,而且当客户不再听事件时,确实没有一种绝对可以取消订阅的好方法。
还有其他/更好的方法吗?
答案 0 :(得分:1)
Channel<T>
,可以通过AsAsyncEnumerable()
进行调整-然后,它实际上在生产者端充当队列,在消费者处充当序列。