Який правильний підпис для дії контролера, який повертає значення IAsyncEnumerable<T>
a і 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
те, що повертаєIEnumerable
- воно буде просто порожнім - або ви повернете один елемент із запитанимid
/NotFound
.