Chữ ký phù hợp cho hành động của bộ điều khiển trả về một IAsyncEnumerable<T>và một NotFoundResultnhưng vẫn được xử lý theo kiểu không đồng bộ?
Tôi đã sử dụng chữ ký này và nó không được biên dịch vì IAsyncEnumerable<T>không thể chờ đợi:
[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);
}
}
Cái này biên dịch tốt nhưng chữ ký của nó không đồng bộ. Vì vậy, tôi lo lắng liệu nó sẽ chặn chủ đề nhóm chủ đề hay không:
[HttpGet]
public IActionResult GetAll(Guid id)
{
try
{
return Ok(repository.GetAll(id)); // GetAll() returns an IAsyncEnumerable
}
catch (NotFoundException e)
{
return NotFound(e.Message);
}
}
Tôi đã thử sử dụng một await foreachvòng lặp như thế này nhưng rõ ràng nó cũng không được biên dịch:
[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đang chờ đợi Sử dụng await foreach(var item from ThatMethodAsync()){...}.
IAsyncEnumerable<MyObject>, chỉ cần trả về kết quả, vd return objects. Tuy nhiên, điều đó sẽ không chuyển đổi một hành động HTTP thành một phương thức gRPC hoặc SignalR phát trực tuyến. Phần mềm trung gian vẫn sẽ tiêu thụ dữ liệu và gửi một phản hồi HTTP cho khách hàng
IAsyncEnumerablebiết đến từ 3.0.
MyObjectmặt hàng với cùng mộtid? Thông thường Bạn sẽ không gửi mộtNotFoundcái gì đó trả vềIEnumerable- nó sẽ trống - hoặc bạn sẽ trả lại một mục duy nhất với yêu cầuid/NotFound.