Jaki jest prawidłowy podpis dla akcji kontrolera, która zwraca IAsyncEnumerable<T>
i a, NotFoundResult
ale 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 foreach
pę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;
}
}
IAsyncEnumerable
jest 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
IAsyncEnumerable
od wersji 3.0.
MyObject
przedmiotów z tym samymid
? Zwykle nie wysyłałbyśNotFound
za coś, co zwracaIEnumerable
- byłby po prostu pusty - lub zwracałbyś pojedynczy przedmiot z żądanymid
/NotFound
.