1

我想从 WebAPI 的角度验证这是否是数据集异步消费的正确用法。

IQueryable<T>可以在这里看到创建扩展的类似实现。

GetByProcedureAsync()使用这个想法来创建 SqlDataReader,如下所示: var result = await System.Threading.Tasks.Task.Factory.FromAsync<SqlDataReader>(cmd.BeginExecuteReader(), cmd.EndExecuteReader);

我需要在 MVC WebApi 控制器操作中使用它。我没有足够的知识来快速判断我是否妨碍了设计的异步性。

我是这样做public HttpResponseMessage Get([FromUri] int key)还是public async Task<HttpResponseMessage> Get([FromUri] int key)这样做:

public HttpResponseMessage Get([FromUri] int key)
{
    HttpResponseMessage response = Request.CreateResponse();
    response.Content = new PushStreamContent(async (stream, content, context) =>
    {
        try
        {
            var set = await MyRepo.GetByProcedureAsync("PROC_NAME", key);
            // set is IEnumerable<MyEntity>
            foreach (MyEntity p in set)
            {
                var buffer = System.Text.UTF8Encoding.UTF8.GetBytes(p.ToString());
                await stream.WriteAsync(buffer, 0, buffer.Length);
            }
        }
        finally
        {
            // Close output stream as we are done 
            stream.Close();
        }
    });

    return response;
}

请注意,底层存储过程正在遵守要求,即在相关记录集之前不向客户端推送任何其他内容。

4

0 回答 0