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 NotFoundResult
như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 foreach
vò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
IAsyncEnumerable
biết đến từ 3.0.
MyObject
mặt hàng với cùng mộtid
? Thông thường Bạn sẽ không gửi mộtNotFound
cá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
.