使用PushStreamContent在Web Api控制器操作中使用异步数据

时间:2013-10-01 14:21:50

标签: c# asp.net-web-api async-await

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

可以看到 here 创建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;
}

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

0 个答案:

没有答案