ชี้แจงเกี่ยวกับวิธีที่ IAsyncEnumerable ทำงานร่วมกับ ASP.NET Web API


9

ฉันพบพฤติกรรมที่น่าสนใจขณะสำรวจ IAsyncEnumerable ในโครงการ ASP.NET Web API พิจารณาตัวอย่างรหัสต่อไปนี้:

    // Code Sample 1
    [HttpGet]
    public async IAsyncEnumerable<int> GetAsync()
    {
        for (int i = 0; i < 10; i++)
        {
            await Task.Delay(1000);
            yield return i;
        }
    }


    // Code Sample 2
    [HttpGet]
    public async IAsyncEnumerable<string> GetAsync()
    {
        for (int i = 0; i < 10; i++)
        {
            await Task.Delay(1000);
            yield return i.ToString();
        }
    }

ตัวอย่างที่ 1 (int array) จะคืนค่า{}เป็นผลลัพธ์ของ JSON

["0","1","2","3","4","5","6","7","8","9"]ผลตัวอย่าง 2 ผลตอบแทนที่คาดว่า อย่างไรก็ตามอาร์เรย์ JSON ทั้งหมดจะถูกส่งคืนพร้อมกันหลังจากรอ 10 วินาที ไม่ควรส่งคืนเนื่องจากข้อมูลพร้อมใช้งานตามที่คาดไว้จากอินเทอร์เฟซ IAsyncEnumerable หรือมีวิธีใดที่ควรใช้ API ของเว็บนี้


4
ไม่ควรส่งคืนเนื่องจากข้อมูลพร้อมใช้งานตามที่คาดไว้จากอินเทอร์เฟซ IAsyncEnumerable ... และมันจะ ... แต่สำหรับjson serializer
Selvin

1
และตัวอย่าง 1 .... ดูเหมือนว่าข้อผิดพลาดสำหรับประเภทการอ้างอิงที่ไม่ (ถ้าคุณเปลี่ยนIAsyncEnumerable<int>ไปIAsyncEnumerable<object>- มันควรจะทำงาน แต่แล้วก็มีความเป็นมวยที่เกี่ยวข้อง)
Selvin

@Selvin คุณช่วยอธิบายเพิ่มเติมได้ไหม? หรือชี้ไปที่ตัวอย่างโค้ด? ฉันพยายามใช้ API นี้กับไคลเอนต์ C # ผลลัพธ์เหมือนกันต้องรอ 10 วินาที ...
Ravi M Patel

ต้องรอ 10 วินาทีมันเป็น obviosu ... การทำให้เป็นอนุกรมอยู่บนฝั่งเซิร์ฟเวอร์และไม่ใช่ async ... ทำรายละเอียดเกี่ยวกับอะไร
Selvin

คำตอบ:


3

การเรียกเว็บ api จะไม่ส่งคืน json บางส่วนทุกวินาที มันเป็น serializer ของ json ที่ต้องรอ 10x1 วินาที (หรือรหัสที่เรียก json serialiser ซึ่งเป็นส่วนหนึ่งของ ASP .NET) เมื่อรหัสเฟรมเวิร์กและ serialiser รับข้อมูลทั้งหมดมันจะถูกให้บริการแบบอนุกรมเพื่อตอบสนองต่อลูกค้า

ในประเภทการคืนค่าการกระทำใน ASP.NET Core web APIเราสามารถอ่านได้:

ใน ASP.NET Core 3.0 และใหม่กว่าส่งคืน IAsyncEnumerable จากการดำเนินการ:

  • ไม่มีผลลัพธ์ในการทำซ้ำแบบซิงโครนัสอีกต่อไป
  • มีประสิทธิภาพเท่ากับการคืนค่า IEnumerable

ASP.NET Core 3.0 และใหม่กว่าจะบัฟเฟอร์ผลลัพธ์ของการดำเนินการต่อไปนี้ก่อนที่จะส่งให้กับ serializer:

public IEnumerable<Product> GetOnSaleProducts() =>
  _context.Products.Where(p => p.IsOnSale);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.