Apa tanda tangan yang tepat untuk tindakan pengontrol yang mengembalikan IAsyncEnumerable<T>
dan NotFoundResult
tetapi masih diproses secara async?
Saya menggunakan tanda tangan ini dan tidak dapat dikompilasi karena IAsyncEnumerable<T>
tidak bisa ditunggu-tunggu:
[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);
}
}
Yang ini kompilasi dengan baik tetapi tanda tangannya tidak async. Jadi saya khawatir apakah itu akan memblokir thread pool thread atau tidak:
[HttpGet]
public IActionResult GetAll(Guid id)
{
try
{
return Ok(repository.GetAll(id)); // GetAll() returns an IAsyncEnumerable
}
catch (NotFoundException e)
{
return NotFound(e.Message);
}
}
Saya mencoba menggunakan await foreach
loop seperti ini tapi itu jelas tidak mau dikompilasi:
[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
sudah bisa ditunggu. Gunakan await foreach(var item from ThatMethodAsync()){...}
.
IAsyncEnumerable<MyObject>
, cukup kembalikan hasilnya, mis return objects
. Itu tidak akan mengubah aksi HTTP menjadi streaming gRPC atau metode SignalR. Middleware masih akan mengkonsumsi data dan mengirim satu respons HTTP ke klien
IAsyncEnumerable
-sadar mulai 3.0.
MyObject
item dengan barang yang samaid
? Biasanya Anda tidak akan mengirimNotFound
untuk sesuatu yang mengembalikanIEnumerable
- itu hanya akan kosong - atau Anda akan mengembalikan satu item dengan yang dimintaid
/NotFound
.