IAsyncEnumerable<T>and を返すが、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。それはないだろうけれども、ストリーミングgRPCまたはSignalRメソッドにHTTPアクションを変換します。ミドルウェアは引き続きデータを消費し、単一のHTTP応答をクライアントに送信します
IAsyncEnumerableプラミングは列挙を処理し、3.0以降は認識されます。
MyObject同じで複数のアイテムを返していますidか?通常はNotFound、何かを返すものに対してはを送信しませんIEnumerable-それは単に空である-または要求されたid/を持つ単一のアイテムを返しますNotFound。