Apa tanda tangan yang tepat untuk tindakan pengontrol yang mengembalikan IAsyncEnumerable<T>dan NotFoundResulttetapi 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 foreachloop 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;
}
}
IAsyncEnumerablesudah 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.
MyObjectitem dengan barang yang samaid? Biasanya Anda tidak akan mengirimNotFounduntuk sesuatu yang mengembalikanIEnumerable- itu hanya akan kosong - atau Anda akan mengembalikan satu item dengan yang dimintaid/NotFound.