พื้นที่เก็บข้อมูลนี้มีไลบรารีสี่ไลบรารีซึ่งสัมพันธ์กันทางแนวคิดโดยทั้งหมดเกี่ยวข้องกับ LINQ เหนือลำดับของสิ่งต่าง ๆ:
Reactive Extensions สำหรับ .NET หรือที่รู้จักในชื่อ Rx.NET หรือ Rx (System.Reactive): ไลบรารีสำหรับการเขียนโปรแกรมที่ขับเคลื่อนด้วยเหตุการณ์ด้วยโมเดลที่ประกาศได้และประกอบได้
AsyncRx.NET (แสดงตัวอย่างเชิงทดลอง) (System.Reactive.Async): การทดลองใช้งาน Rx สำหรับ IAsyncObservable<T>
ที่เสนอการสนับสนุน async
ที่ลึกยิ่งขึ้น / await
การสนับสนุน
ส่วนขยายเชิงโต้ตอบสำหรับ .NET หรือที่รู้จักกันในชื่อ Ix (System.Interactive): ตัวดำเนินการ LINQ แบบขยายสำหรับ IAsyncEnumerable
และ IEnumerable
LINQ สำหรับ IAsyncEnumerable
(System.Linq.Async): ใช้ตัวดำเนินการ LINQ มาตรฐานสำหรับ IAsyncEnumerable
แต่ละรายการจะมีการอธิบายในภายหลังใน README นี้
การเขียนโปรแกรมแบบโต้ตอบให้ความชัดเจนเมื่อโค้ดของเราต้องตอบสนองต่อเหตุการณ์ ไลบรารี Rx.NET ได้รับการออกแบบมาเพื่อให้แอปพลิเคชันแบบเนทีฟบนคลาวด์สามารถประมวลผลข้อมูลสดด้วยวิธีที่เชื่อถือได้และคาดเดาได้
เราได้เขียนหนังสือฟรีซึ่งอธิบายนามธรรมที่สำคัญที่สนับสนุน Rx และแสดงวิธีใช้ประโยชน์จากฟังก์ชันการทำงานที่ทรงพลังและกว้างขวางที่สร้างไว้ในไลบรารี Rx.NET
จากหนังสือของ Lee Campbell ในปี 2010 (กรุณาบริจาคให้กับโครงการ) หนังสือเล่มนี้ได้รับการเขียนขึ้นใหม่เพื่อให้ทันสมัยด้วย Rx.NET v6.0, .NET 8.0 และกรณีการใช้งานคลาวด์เนทิฟสมัยใหม่ เช่น IoT และ real- การประมวลผลข้อมูลสตรีมเวลา
ข้อมูลเบื้องต้นเกี่ยวกับ Rx.NET พร้อมใช้งานออนไลน์บน GitHub ในรูปแบบ PDF และ EPUB
ช่อง | รับ | AsyncRx | ทรงเครื่อง | System.Linq.Async |
---|---|---|---|---|
NuGet.org | ||||
ตัวอย่าง NuGet.org (หากใหม่กว่ารีลีส) | ||||
สร้าง | สร้างขึ้นโดยเป็นส่วนหนึ่งของ Ix | |||
สีฟ้า สิ่งประดิษฐ์ | ||||
ประวัติการเปิดตัว | ประวัติการเปิดตัว | ประวัติการเปิดตัว | ประวัติการเปิดตัว |
สำหรับบิลด์ตอนกลางคืน ให้กำหนดค่า NuGet เพื่อใช้ฟีดนี้: https://pkgs.dev.azure.com/dotnet/Rx.NET/_packaging/RxNet/nuget/v3/index.json
ติดตามเราในช่อง #rxnet ได้ที่ https://reactivex.slack.com/
ในยุคดิจิทัลนี้ สตรีมข้อมูลสดมีอยู่ทั่วไปทุกหนทุกแห่ง การสมัครทางการเงินขึ้นอยู่กับการตอบสนองที่รวดเร็วต่อข้อมูลที่ทันท่วงที เครือข่ายคอมพิวเตอร์สามารถให้ข้อมูลที่ครอบคลุมเกี่ยวกับสุขภาพและการดำเนินงานได้ตลอดเวลา บริษัทสาธารณูปโภค เช่น ผู้ให้บริการน้ำ มีอุปกรณ์จำนวนมากที่ติดตามการดำเนินงานของตน ส่วนต่อประสานกับผู้ใช้และเฟรมเวิร์กการสร้างเกมรายงานการโต้ตอบของผู้ใช้โดยละเอียด รถตู้ส่งของรายงานความคืบหน้าอย่างต่อเนื่อง เครื่องบินมีระบบโทรมาตรที่มีประสิทธิภาพเพื่อตรวจจับปัญหาการบำรุงรักษาที่อาจเกิดขึ้นก่อนที่จะกลายเป็นปัญหาร้ายแรง และขณะนี้รถยนต์ก็เริ่มทำเช่นเดียวกัน พวกเราหลายคนสวมหรือพกพาอุปกรณ์ที่ติดตามกิจกรรมทางกายของเราและแม้แต่สัญญาณชีพ และการปรับปรุงการเรียนรู้ของเครื่องได้เพิ่มพูนข้อมูลเชิงลึกที่ได้จากปริมาณข้อมูลสดที่เพิ่มขึ้นเรื่อยๆ และความหลากหลายของข้อมูล
แต่ถึงแม้จะแพร่หลายมาก แต่การสตรีมข้อมูลสดก็ถือเป็นพลเมืองชั้นสองมาโดยตลอด ภาษาโปรแกรมเกือบทั้งหมดมีวิธีทำงานกับรายการข้อมูลโดยธรรมชาติ (เช่น อาร์เรย์) แต่กลไกเหล่านี้มีแนวโน้มที่จะสันนิษฐานว่าข้อมูลที่เกี่ยวข้องนั้นอยู่ในหน่วยความจำอยู่แล้ว และพร้อมให้เราทำงานกับมัน สิ่งที่ขาดหายไปคือความมีชีวิตชีวา—ข้อเท็จจริงที่ว่าแหล่งข้อมูลอาจสร้างข้อมูลใหม่ได้ทุกเวลาตามกำหนดเวลาของตัวเอง
Rx ยกระดับการรองรับสตรีมข้อมูลสดให้อยู่ในระดับเดียวกับที่เราคาดหวังสำหรับสิ่งต่าง ๆ เช่นอาร์เรย์ นี่คือตัวอย่าง:
var bigTrades = จากการซื้อขายในการซื้อขายโดยที่ trade.Volume > 1_000_000 เลือกการซื้อขาย;
สิ่งนี้ใช้ฟีเจอร์ LINQ ของ C# เพื่อกรอง trades
จนถึงเอนทิตีที่มีปริมาณมากกว่าหนึ่งล้าน ไวยากรณ์นิพจน์แบบสอบถามนี้เป็นเพียงการย่อสำหรับการเรียกใช้เมธอด ดังนั้นเราจึงสามารถเขียนได้ในลักษณะนี้:
var bigTrades = trades.Where(trade => trade.Volume > 1_000_000);
ลักษณะการทำงานที่แน่นอนของโค้ดทั้งสอง (เทียบเท่า) นี้ขึ้นอยู่กับประเภท trades
ที่มี หากเป็น IEnumerable<Trade>
แบบสอบถามนี้จะวนซ้ำในรายการและ bigTrades
จะเป็นลำดับนับได้ที่มีเพียงวัตถุที่ตรงกัน หาก trades
เป็นวัตถุที่แสดงถึงตารางฐานข้อมูล (เช่น Entity Framework DbSet สิ่งนี้จะถูกแปลเป็นการสืบค้นฐานข้อมูล แต่ถ้าเราใช้ Rx trades
จะเป็น IObservable<Trade>
ซึ่งเป็นวัตถุที่รายงานเหตุการณ์สดตามที่พวกเขา และ bigTrades
จะเป็น IObservable<Trade>
โดยรายงานเฉพาะการซื้อขายที่มีปริมาณมากกว่าล้านรายการ เราสามารถให้ Rx พร้อมการโทรกลับเพื่อเรียกใช้ในแต่ละครั้ง แหล่งที่มาที่สังเกตได้มีบางอย่างสำหรับเรา:
bigTrades.Subscribe(t => Console.WriteLine($"{t.Symbol}: ซื้อขายด้วยปริมาณ {t.Volume}"));
คุณสมบัติหลักสองประการของ Rx คือ:
วิธีที่กำหนดไว้อย่างชัดเจนในการแสดงและจัดการลำดับข้อมูลสด ( IObservable<T>
)
ชุดของตัวดำเนินการ (เช่น ตัวดำเนินการ Where
ที่เพิ่งแสดง) ทำให้ตรรกะการประมวลผลเหตุการณ์สามารถแสดงออกมาได้อย่างเปิดเผย
Rx ได้รับการนำไปใช้อย่างประสบความสำเร็จเป็นพิเศษในส่วนต่อประสานกับผู้ใช้ (สิ่งนี้ก็เป็นจริงเช่นกันเมื่ออยู่นอก .NET—RxJS นั้นเป็น JavaScript แยกจาก Rx และเป็นที่นิยมอย่างมากในโค้ดส่วนต่อประสานกับผู้ใช้) https://github.com/reactiveui/reactiveui ใช้ Rx อย่างลึกซึ้งเพื่อรองรับ การพัฒนา .NET UI
Ian Griffiths นำเสนอภาพรวมสั้นๆ 60 นาทีของ Reactive Extensions สำหรับ .NET ที่งานพบปะ dotnetsheff ในปี 2020 มีวิดีโอเพิ่มเติมอยู่ในเพลย์ลิสต์ Rx
แม้ว่า Rx เป็นวิธีธรรมชาติในการสร้างแบบจำลองกระบวนการอะซิงโครนัส แต่การออกแบบดั้งเดิมสันนิษฐานว่าโค้ดที่ดำเนินการกับการแจ้งเตือนจะทำงานพร้อมกัน เนื่องจากการออกแบบของ Rx มีมาก่อนฟีเจอร์ภาษา async
/ await
ของ C# ดังนั้นแม้ว่า Rx จะเสนออะแดปเตอร์ที่สามารถแปลงระหว่าง IObservable<T>
และ Task<T>
ได้ แต่ก็มีบางกรณีที่ async
ไม่ใช่ตัวเลือก
AsyncRx.Net ยกเลิกข้อจำกัดนี้โดยกำหนด IAsyncObservable<T>
สิ่งนี้ทำให้ผู้สังเกตการณ์สามารถใช้โค้ดอะซิงโครนัสได้ ตัวอย่างเช่น หาก bigTrades
เป็น IAsyncObservable<Trade>
เราสามารถเขียนสิ่งนี้ได้:
bigTrades.Subscribe(async t => รอ bigTradeStore.LogTradeAsync(t));
AsyncRx.Net อยู่ระหว่างการแสดงตัวอย่าง
Rx กำหนดตัวดำเนินการ LINQ มาตรฐานทั้งหมดที่มีให้สำหรับผู้ให้บริการรายอื่น แต่ยังเพิ่มตัวดำเนินการเพิ่มเติมอีกมากมาย ตัวอย่างเช่น กำหนด Scan
ซึ่งดำเนินการประมวลผลพื้นฐานเหมือนกับตัวดำเนินการ Aggregate
มาตรฐาน แต่แทนที่จะสร้างผลลัพธ์เดียวหลังจากประมวลผลทุกองค์ประกอบ กลับสร้างลำดับที่มีค่ารวมหลังจากทุกขั้นตอน (ตัวอย่างเช่น หากการดำเนินการที่ถูกรวมเป็นการบวก Aggregate
จะส่งคืนผลรวมทั้งหมดเป็นเอาต์พุตเดียว ในขณะที่ Scan
จะสร้างผลรวมต่อเนื่องสำหรับแต่ละอินพุต โดยกำหนดลำดับ [1,2,3]
, Aggregate((a, x) => a + x)
สร้างเพียง 6
ในขณะที่ Scan
จะสร้าง [1,3,6]
.)
ตัวดำเนินการเพิ่มเติมบางตัวที่ Rx กำหนดจะมีประโยชน์เฉพาะเมื่อคุณทำงานกับเหตุการณ์เท่านั้น แต่บางอันก็ใช้ได้กับลำดับทุกประเภท ดังนั้น Interactive Extensions (เรียกสั้น ๆ ว่า Ix) กำหนดการนำไปใช้งานสำหรับ IEnumerable<T>
Ix เป็นส่วนขยายของ LINQ ไปยัง Objects อย่างมีประสิทธิภาพ โดยเพิ่มตัวดำเนินการเพิ่มเติมจำนวนมาก (ประโยชน์ที่ได้รับเกิดจากการที่ไลบรารีรันไทม์ .NET ได้เพิ่มตัวดำเนินการบางตัวที่เคยใช้ได้เฉพาะใน Ix เมื่อเวลาผ่านไป ตัวอย่างเช่น .NET 6 ได้เพิ่ม MinBy
และ MaxBy
ซึ่งเป็นตัวดำเนินการที่ก่อนหน้านี้กำหนดโดยเท่านั้น ทรงเครื่อง)
ไลบรารีนี้เรียกว่า "ส่วนขยายแบบโต้ตอบ" เนื่องจาก "แบบโต้ตอบ" มีความหมายตรงกันข้ามกับ "แบบโต้ตอบ" (ชื่อไม่ได้หมายถึงการโต้ตอบของผู้ใช้)
IAsyncEnumerable
( System.Linq.Async
) หนึ่งในคุณสมบัติที่บุกเบิกโดย Ix คือเวอร์ชันอะซิงโครนัสของ IEnumerable<T>
นี่เป็นอีกตัวอย่างหนึ่งของคุณสมบัติที่มีประโยชน์มากจนในที่สุดก็ถูกเพิ่มลงในไลบรารีรันไทม์ .NET: .NET Core 3.0 เปิดตัว IAsyncEnumerable<T>
และเวอร์ชันที่เกี่ยวข้อง C# (8.0) ได้เพิ่มการสนับสนุนที่แท้จริงสำหรับอินเทอร์เฟซนี้ด้วย await foreach
โครงสร้าง .
แม้ว่า .NET Core 3.0 จะกำหนด IAsyncEnumerable<T>
แต่ก็ไม่ได้เพิ่มการใช้งาน LINQ ใดๆ ที่เกี่ยวข้อง ในขณะที่ IEnumerable<T>
รองรับตัวดำเนินการมาตรฐานทั้งหมด เช่น Where
, GroupBy
และ SelectMany
, .NET ไม่มีการใช้งานในตัวของสิ่งเหล่านี้สำหรับ IAsyncEnumerable<T>
อย่างไรก็ตาม Ix ได้จัดเตรียมตัวดำเนินการ LINQ สำหรับเวอร์ชันต้นแบบของ IAsyncEnumerable<T>
ตั้งแต่เริ่มต้น ดังนั้นเมื่อมีการจัดส่ง .NET Core 3.0 จึงเป็นงานที่ค่อนข้างตรงไปตรงมาในการอัปเดตตัวดำเนินการ LINQ ที่มีอยู่ทั้งหมดให้ทำงานกับ IAsyncEnumerable<T>
.
ดังนั้น แพคเกจ System.Linq.Async NuGet จึงถูกสร้างขึ้น โดยจัดเตรียม LINQ ให้กับการใช้งาน Objects สำหรับ IAsyncEnumerable<T>
เพื่อให้ตรงกับแพ็คเกจที่สร้างไว้แล้วใน .NET สำหรับ IEnumerable<T>
เนื่องจากโค้ดที่เกี่ยวข้องทั้งหมดเป็นส่วนหนึ่งของโปรเจ็กต์ Ix แล้ว (โดยที่ IAsyncEnumerable<T>
เดิมถูกกำหนดโดยโปรเจ็กต์นี้ด้วย) แพ็คเกจ System.Linq.Async NuGet จึงถูกสร้างขึ้นโดยเป็นส่วนหนึ่งของโปรเจ็กต์ Ix
วิธีที่ดีที่สุดบางส่วนในการมีส่วนร่วมคือการทดลองใช้ แจ้งจุดบกพร่อง และเข้าร่วมการสนทนาเกี่ยวกับการออกแบบ
โคลนแหล่งที่มา: git clone https://github.com/dotnet/reactive
การสร้าง การทดสอบ และการดีบักแหล่งที่มา
วิธีการมีส่วนร่วม
คำขอดึง: เปิด/ปิด
กำลังมองหาบางอย่างที่จะทำงานอยู่ใช่ไหม? รายการปัญหาที่ต้องคว้าไว้เป็นจุดเริ่มต้นที่ดี
โครงการนี้ได้นำหลักจรรยาบรรณที่ดัดแปลงมาจากข้อตกลงผู้ร่วมให้ข้อมูลมาใช้เพื่อชี้แจงพฤติกรรมที่คาดหวังในชุมชนของเรา หลักจรรยาบรรณนี้ได้รับการรับรองจากโครงการอื่นๆ มากมาย สำหรับข้อมูลเพิ่มเติม โปรดดูหลักจรรยาบรรณ
โปรเจ็กต์นี้เป็นส่วนหนึ่งของ .NET Foundation พร้อมกับโปรเจ็กต์อื่นๆ เช่น .NET Runtime .NET Foundation มอบโครงสร้างพื้นฐาน DevOps ให้กับโปรเจ็กต์นี้เพื่อคอมไพล์ ทดสอบ ลงนาม และจัดทำแพ็คเกจโซลูชันที่ซับซ้อนซึ่งมีการดาวน์โหลดมากกว่า 100 ล้านครั้ง นอกจากนี้ยังจัดให้มีนักอนุรักษ์ที่ทำให้โครงการสามารถส่งต่อจากผู้ดูแลหนึ่งไปยังอีกผู้ดูแล ทำให้เกิดความต่อเนื่องสำหรับชุมชน
ผู้คนที่ดูแล Rx ในปัจจุบันคือ:
เอียน กริฟฟิธส์ โฮฟ, สหราชอาณาจักร บล็อกของเอียนที่ endjin.com | ฮาวเวิร์ด ฟาน รอยเจน วินเชสเตอร์, สหราชอาณาจักร บล็อกของ Howard บน endjin.com |
Rx ดำเนินกิจการมาประมาณหนึ่งทศวรรษครึ่งแล้ว ดังนั้นเราจึงเป็นหนี้บุญคุณผู้สร้าง Rx มากมาย และผู้คนมากมายที่ทำงานเกี่ยวกับ Rx ตั้งแต่นั้นมา ดู AUTHORS.txt สำหรับรายการทั้งหมด
ในฐานะส่วนหนึ่งของ .NET Conf 2023 Ian Griffiths ได้ให้ข้อมูลอัปเดตเกี่ยวกับความพยายามในการปรับปรุง Rx.NET สำหรับเวอร์ชัน 6.0 และแผนสำหรับเวอร์ชัน 7.0 ให้ทันสมัย
สำหรับข้อมูลเพิ่มเติม โปรดดูการสนทนาต่อไปนี้:
บรรจุภัณฑ์ Rx.NET ในอนาคต
แผนระดับสูง Rx.NET v6.0 และ v7.0
เราได้กำหนดแผนงานที่อธิบายแผนระยะกลางของเราสำหรับการพัฒนา Rx อย่างต่อเนื่อง แผนภาพนี้แสดงมุมมองของเราเกี่ยวกับแพลตฟอร์มที่ใช้ Rx และวงจรการใช้งานการสนับสนุนที่วางแผนไว้สำหรับเป้าหมายต่างๆ เหล่านี้: