[英]GRPC async response stream C#
如何從處理程序外部生成RPC的流響應值? (具體來說,來自IObservable)我目前正在執行以下操作,但這會產生跨線程問題,因為在RPC處理程序之間共享AnRxObservable
...
public override Task GetTicker(RequestProto request, ServerCallContext context)
{
var subscription = AnRxObservable.Subscribe(value =>
{
responseStream.WriteAsync(new ResponseProto
{
Value = value
});
});
// Wait for the RPC to be canceled (my extension method
// that returns a task that completes when the CancellationToken
// is cancelled)
await context.CancellationToken.WhenCancelled();
// Dispose of the buffered stream
bufferedStream.Dispose();
// Dispose subscriber (tells rx that we aren't subscribed anymore)
subscription.Dispose();
return Task.FromResult(1);
}
這段代碼感覺不對......但我看不到從RPC處理程序外部創建的共享源流式傳輸RPC響應的任何其他方式。
一般來說,當您嘗試從推模型(IObservable)轉換為拉模型(枚舉響應以寫入和寫入它們)時,您需要一個消息的中間緩沖區 - 例如blockingQueue。 然后,處理程序主體可以是異步循環,嘗試獲取隊列的下一條消息(最好以異步方式)並將其寫入responseStream。
此外,請注意,gRPC API僅允許您在任何給定時間進行1次飛行中響應 - 而且您的代碼段不符合此要求。 因此,您需要在開始另一次寫入之前等待WriteAsync()(這是您需要中間隊列的另一個原因)。
這個鏈接可能有助於解釋push vs pull范例: 何時使用IEnumerable vs IObservable?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.