对于返回an IAsyncEnumerable<T>
和a NotFoundResult
但仍以异步方式处理的控制器操作,正确的签名是什么?
我使用了此签名,由于IAsyncEnumerable<T>
无法等待,因此无法编译:
[HttpGet]
public async Task<IActionResult> GetAll(Guid id)
{
try
{
return Ok(await repository.GetAll(id)); // GetAll() returns an IAsyncEnumerable
}
catch (NotFoundException e)
{
return NotFound(e.Message);
}
}
这个编译很好,但是它的签名不是异步的。因此,我担心它是否会阻塞线程池线程:
[HttpGet]
public IActionResult GetAll(Guid id)
{
try
{
return Ok(repository.GetAll(id)); // GetAll() returns an IAsyncEnumerable
}
catch (NotFoundException e)
{
return NotFound(e.Message);
}
}
我试过await foreach
像这样使用循环,但是显然也不会编译:
[HttpGet]
public async IAsyncEnumerable<MyObject> GetAll(Guid id)
{
IAsyncEnumerable<MyObject> objects;
try
{
objects = contentDeliveryManagementService.GetAll(id); // GetAll() returns an IAsyncEnumerable
}
catch (DeviceNotFoundException e)
{
return NotFound(e.Message);
}
await foreach (var obj in objects)
{
yield return obj;
}
}
IAsyncEnumerable
值得期待。使用await foreach(var item from ThatMethodAsync()){...}
。
IAsyncEnumerable<MyObject>
,只需返回结果,例如return objects
。但这不会将HTTP操作转换为流gRPC或SignalR方法。中间件仍将使用数据并向客户端发送单个HTTP响应
IAsyncEnumerable
从3.0开始就知道。
MyObject
物品相同id
吗?通常,您不会NotFound
为会返回an的内容发送“ a ”IEnumerable
-它只是空的-否则您将返回带有所请求的id
/ 的单个项目NotFound
。