【问题标题】:API which returns IAsyncEnumerable<T> but results are not streamed返回 IAsyncEnumerable<T> 但结果未流式传输的 API
【发布时间】:2020-09-08 13:24:09
【问题描述】:

我正在尝试使用返回 IAsyncEnumerable 的 API

public async IAsyncEnumerable<Xtype> Get([Required]int maxx=10)
{
    var result = _context.dbcontext.Take(maxx).AsAsyncEnumerable();

    await foreach (var Xtype in y)
    {
        await Task.Delay(1000); 
        yield return Xtype;
    }
}

但我会在 10 秒后得到结果,但我认为我会在每一秒后开始得到结果

【问题讨论】:

  • 这里的 XType 和 y 是什么?!请编辑您的问题,它完全不清楚并更正其格式问题。
  • HTTP 不允许流式传输结果。返回IAsyncEnumerable 并不意味着服务将为每个项目返回单独的 HTTP 响应 - 没有这样的事情。如果要向服务器返回数据流,则需要使用 SignalR 或 gRPC 和服务器流。
  • XType 是我要返回的一些返回类型
  • 当您返回 IAsyncEnumerable 时,any 堆栈或语言中的 HTTP 服务仍将返回一个响应,并在响应流到达时将每个项目写入响应流。与IEnumerable 的不同之处在于中间件不必阻塞等待每个项目的生成
  • 网络上真的一样!简而言之,async/await 仅在其进程域中具有优势。不通过网络

标签: c# entity-framework rest async-await


【解决方案1】:

首先

改变

public async IAsyncEnumerable Get([Required]int maxx=10)

public async Task<IAsyncEnumerable> Get([Required]int maxx=10)

但是无论如何你会在 10 秒后得到结果,因为响应只发送给客户端一次,所以在它的过程完全完成之前不会发送给客户端。

Task&lt;IAsyncEnumerable&gt; 的主要目的是赋予IEnumerable 类型awaitable 的能力。它与 Http 上的流式传输行为无关。

【讨论】:

  • await foreach (var Xtype in y) { await Task.Delay(1000);收益返回 Xtype;这应该在每一秒后返回结果,这就是 IAsyncEnumerable 的用途吗?
猜你喜欢
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
相关资源
最近更新 更多