我想从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正在遵守在相关记录集之前不向客户端推送任何其他内容的要求。