我想从 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;
}
请注意,底层存储过程正在遵守要求,即在相关记录集之前不向客户端推送任何其他内容。