नियंत्रक क्रिया के लिए सही हस्ताक्षर क्या है जो रिटर्न करता है IAsyncEnumerable<T>
और NotFoundResult
फिर भी एक async फैशन में संसाधित होता है?
मैंने इस हस्ताक्षर का उपयोग किया है और यह संकलन 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);
}
}
यह ठीक संकलित करता है, लेकिन इसका हस्ताक्षर Async नहीं है। इसलिए मैं चिंतित हूं कि यह थ्रेड पूल धागे को अवरुद्ध करेगा या नहीं:
[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
। हालांकि यह HTTP एक्शन को स्ट्रीमिंग जीआरपीसी या सिग्नलआर विधि में परिवर्तित नहीं करेगा । मिडलवेयर अभी भी डेटा का उपभोग करेगा और क्लाइंट को एक ही HTTP रिस्पांस भेजेगा
IAsyncEnumerable
3.0 के रूप में अनभिज्ञ है।
MyObject
एक ही के साथ कई आइटम वापस कर रहे हैंid
? आम तौर पर आप किसीNotFound
ऐसी चीज़ के लिए नहीं भेजते हैं जो रिटर्न करती हैIEnumerable
- यह सिर्फ खाली होगी - या आप अनुरोधितid
/ के साथ एकल आइटम लौटाएंगेNotFound
।