Jaki jest prawidłowy podpis dla akcji kontrolera, która zwraca IAsyncEnumerable<T>i a, NotFoundResultale jest nadal przetwarzana w sposób asynchroniczny?
Użyłem tego podpisu i nie można go skompilować, ponieważ IAsyncEnumerable<T>nie jest to oczekiwane:
[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);
}
}
Ten kompiluje się dobrze, ale jego podpis nie jest asynchroniczny. Martwię się więc, czy zablokuje wątki puli wątków, czy nie:
[HttpGet]
public IActionResult GetAll(Guid id)
{
try
{
return Ok(repository.GetAll(id)); // GetAll() returns an IAsyncEnumerable
}
catch (NotFoundException e)
{
return NotFound(e.Message);
}
}
Próbowałem użyć await foreachpętli w ten sposób, ale to oczywiście nie skompiluje:
[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;
}
}
IAsyncEnumerablejest oczekiwany. Zastosowanie await foreach(var item from ThatMethodAsync()){...}.
IAsyncEnumerable<MyObject>, po prostu zwróć wynik, np return objects. Że nie będzie konwertować działanie HTTP streaming gRPC lub SignalR metody chociaż. Oprogramowanie pośrednie nadal będzie pobierać dane i wysyłać pojedynczą odpowiedź HTTP do klienta
IAsyncEnumerableod wersji 3.0.
MyObjectprzedmiotów z tym samymid? Zwykle nie wysyłałbyśNotFoundza coś, co zwracaIEnumerable- byłby po prostu pusty - lub zwracałbyś pojedynczy przedmiot z żądanymid/NotFound.