在gRPC Steam中返回应该永远保持打开状态的新数据

问题描述

我有一个gRPC服务,它将数据传输到连接的客户端,直到客户端终止连接。

我已经使用虚拟数据并使用Task.Delay,但是我在弄清楚如何将真实数据投入使用方面遇到困难。

public override async Task SubscribetoNewData(Empty request,IServerStreamWriter<MyModel> responseStream,ServerCallContext context)
{

    while(true)
    {
        var data = await GetNewData();
        await responseStream.WriteAsync(data);
    }

}

// Dummy implementation
private async Task<MyModel> GetNewData()
{
    await Task.Delay(5000);
    MyModel output = new MyModel();
    return output;
} 

public void SetData(MyModel data)
{
    ??
}

SetData大约每5秒从类外部调用一次。发生这种情况时,我不会立即将数据写入responseStream。

如何实现SetData和GetNewData以获得此功能

解决方法

也许对您的传入MyModel数据使用ConcurrentQueue,并在您的SubscribeToNewData方法中将SemaphoreSlim设置为WaitAsync?