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
。