簡體   English   中英

GRPC異步響應流C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM