Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 2585|Atsakyti: 2

[Šaltinis] Temų tyrinėjimas ".Net Reactive Responsive" plėtinyje

[Kopijuoti nuorodą]
Paskelbta 2024-01-27 12:17:19 | | | |
.Net reaktyvusis plėtinys suteikia kūrėjams funkcijų rinkinį, skirtą įgyvendinti reaktyvaus programavimo modelį .Net kūrėjams, kad įvykių valdymas būtų paprastesnis ir išraiškingesnis naudojant deklaratyvius veiksmus. Nors pagrindiniai reaktyvaus mastelio keitimo akmenys yra "IObserver" ir "IObservable" sąsajos, jums, kaip kūrėjui, dažnai nereikia patiems diegti šių sąsajų. Biblioteka palaiko įmontuotą "Subject" tipą<T>, kuris įgyvendina sąsajas ir palaiko daugybę funkcijų.

Temos yra įvairių bibliotekoje esančių temų pagrindas, taip pat yra ir kitų temų – ReplaySubject<T>, BehaviorSubject<T> ir AsyncSubject<T>. Naudinga suprasti esminius jų skirtumus ir kaip juos naudoti, kad geriau išnaudotumėte biblioteką.

Šiame straipsnyje palyginsime subjektą<T> ir jo brolį, bandydami iliustruoti jų elgesio skirtumus.

Tema<T>

Kaip minėta anksčiau, "Subject"<T> yra galimų temų pagrindas, suteikiantis paprastą būdą naudotis biblioteka, patiems neįdiegiant "IObservable"<T> ir "IObserver"<T> sąsajų. Žemiau parodyta paprasta temos tipo demonstracija.

Aukščiau pateiktame kode sukūrėme <T>"Subject" egzempliorių, o kadangi jis įdiegia<T> "IObserver" ir "IObserverable<T>", naudokite tą patį egzempliorių, kad užsiprenumeruotumėte ir paskelbtumėte reikšmę "IObserver". Kitas svarbus dalykas, į kurį reikia atkreipti dėmesį, yra tai, kaip mes naudojame prenumeratos metodo perkrovą, kad priimtume veiksmus kaip įvestį. Tai bus padaryta kiekvienai paskelbtai reikšmei, šiuo atveju spausdinant numerį į konsolę.

Pabandykime parodyti paskelbtas reikšmes ir reikšmes, kurias "IObserver" (šiame veiksme<T>) spausdina konsolėje šiame paveikslėlyje. Tai padės mums lengvai palyginti likusius brolius ir seseris bei variantus.



Pirmoji eilutė nurodo publikuotą reikšmę, o antroji – IObserver gautą reikšmę. Be to, pridėjome eilutę, nurodančią, kada stebėtojas užsiprenumeruoja srautą vykdymo metu. Ši linija žymima vertikalia punktyrine linija.

Aukščiau pateiktame kode pastebėjome, kad stebėtojas užsiprenumeravo duomenų srautą prieš paskelbdamas pirmąją vertę. Paveikslėlyje parodyta prenumeratoriaus eilutė, esanti prieš pirmąjį elementą. Kaip matote iš išvesties eilutės, tai neturi įtakos išėjimui (šiuo metu).

Bet ką daryti, jei stebėtojas prenumeruoja duomenis tik po to, kai kai kurios vertės jau buvo paskelbtos? Ar tai turi įtakos stebėtojų gaunamiems duomenims? Prieš žiūrėdami į išvestį, pirmiausia parašykime tą patį kodą.

Aukščiau pateiktame kode galime pastebėti, kad stebėtojas užsiprenumeruoja duomenų srautą tik po to, kai paskelbiamos dvi reikšmės (1 ir 2). Kaip ir galima tikėtis, dėl to stebėtojai negaus paskelbtų duomenų prieš skambindami prenumeratos metodui. Kaip parodyta paveikslėlyje žemiau.



Ką daryti, jei norite perskaityti visas paskelbtas vertes, net jei stebėtojas užsiprenumeruoja pavėluotai? Čia atsiranda "ReplaySubject<T>".

Pakartoti temą<T>

"ReplaySubject"<T> talpykloje saugo reikšmes ir pakartoja jas vėlesniems prenumeratoriams. Tai naudinga norint išvengti lenktynių sąlygų. Pakeiskime ankstesnį kodą, kad naudotume "ReplaySubject",<T> ir pažiūrėkime, kaip tai veikia tai, ką gauna stebėtojas.

Kaip parodyta aukščiau esančiame kode,<T> <T>kodas beveik nesikeičia, išskyrus tai, kad dabar naudojame ReplaySubject vietoj temos. Toliau pateiktoje diagramoje parodytas poveikis stebėtojo gautiems duomenims.



Kaip parodyta paveikslėlyje, talpykloje saugoma vertė dabar atkuriama abonentui, net jei abonentas užsiprenumeruoja vėliau. Žinoma, ši naudinga funkcija turi savo kainą. Šis įgyvendinimas talpykloje išsaugos visas abonento paskelbtas reikšmes, o tai gali sukelti blogų atminties problemų, kai duomenų kiekis yra žymiai didesnis.

Tačiau "ReplaySubject"<T> turi daugiau nei vieną būdą, kaip išspręsti šią problemą. Šiame pavyzdyje apžvelgsime du pavyzdžius, kuriuose talpyklos reikšmei apriboti bus naudojami dydžio ir laiko apribojimai.

Pirmuoju atveju talpyklos dydį naudosime talpyklos vertei apriboti. <T>"ReplaySubject" konstruktorius pateikia perkrovą, kuri priima sveikąjį skaičių, kuris nurodo talpyklos buferio dydį (maksimalus elementų skaičius). Mūsų pavyzdyje pakeiskime kodą, kad apribotume talpyklos dydį iki 1.

Atkreipkite dėmesį, kaip mes naudojame <T>ReplaySubject konstruktoriaus perkrovą, kad talpyklos dydis būtų 1. Tai apriboja talpyklą ir užtikrina, kad tik vienas elementas būtų saugomas talpykloje ir pakeistas nauju, kai tik jis paskelbiamas. Pakeitimo poveikis parodytas žemiau.



Kitas būdas apriboti talpyklą yra apriboti talpykloje saugomo elemento laiką arba, kitaip tariant, nurodyti talpyklos elemento galiojimo laiką.

Parašykime kodą, kad iliustruotume šį pavyzdį.

Panašiai kaip ir ankstesniame kode, mes naudojame<T> "ReplaySubject" konstruktoriaus perkrovą, kad nurodytume talpykloje esančių elementų galiojimo laiką. Norėdami parodyti savo atvejį, mes nustatėme atidėjimą tarp vertybių paskelbimo.

Kadangi stebėtojas užsiprenumeruoja visas 1200 ms, visi elementai, viršijantys 1000 ms galiojimo laiką, bus pašalinti iš talpyklos. Šiame pavyzdyje 1 reikšmė bus pašalinta iš talpyklos ir nebus pakartota vėluojantiems prenumeratoriams. Kaip parodyta paveikslėlyje žemiau.



<T>Yra ir kitų "ReplaySubject" perkrovų, kurios suteikia daugiau lankstumo ir tiksliai sureguliuoja talpykloje saugomas reikšmes, tačiau pavyzdžiui, išlaikysime du pavyzdžius, jau aptartus aukščiau.

Elgesio tema<T>

"BehaviorSubject" <T>yra labai panašus į "ReplaySubject<T>", nes padeda talpykloje išsaugoti reikšmes. Tačiau yra reikšmingas skirtumas. BehaviorSubject<T> talpykloje saugo tik paskutinę publikuotą reikšmę. Prieš pradėdami gilintis į tai, parašykime kodą.

Jei BehaviorSubject<T> talpykloje saugo tik vieną reikšmę (kuri yra paskutinė žinoma), kuo ji skiriasi nuo 1 dydžio ReplaySubject<T>? Toliau pateiktoje diagramoje aiškiai atspindėta aukščiau pateikto kodo situacija.



Tačiau tai nėra visiškai tiesa. Čia reikia suprasti du svarbius skirtumus. Pirmasis yra įsipareigojimų nevykdymas. Atkreipkite dėmesį, kad aukščiau pateiktame kode <T>pateikiame reikšmę 0 kaip numatytąją reikšmę BehaviorSubject konstruktoriuje. Jei talpykloje nėra jokios reikšmės (arba, kitaip tariant, jokie duomenys nebuvo paskelbti prieš stebėtojui užsiprenumeruojant), bus grąžinta numatytoji reikšmė. Tai skiriasi nuo ReplaySubject, kurio dydis yra 1<T>, kuris neturi jokios vertės. Šis kodas ir vaizdinis sekos vaizdas rodo šį elgesį.



Antrasis skirtumas yra tai, kaip elgiasi "<T>BehaviorSubject" ir "ReplaySubject"<T> užsiprenumeruojant užbaigtą seką. Kai užsiprenumeruojate po užbaigimo, BehaviorSubject <T> neturės jokios vertės, kaip parodyta žemiau esančiame kode.

Abonentams garantuojama, kad jie negaus jokios vertės, nes prenumeratos atsiranda užbaigus.



Tačiau <T>taip yra su ReplaySubject . Nėra garantijos, kad stebėtojas negaus jokių verčių, kaip parodyta žemiau esančiame kode.

Kaip parodyta aukščiau esančiame kode, talpykla yra 1 dydžio ir net jei prenumerata iškviečiama baigus skambutį, talpykla išliks (kol bus įvykdyta galiojimo pabaigos sąlyga), todėl tokiu atveju bus gauta paskutinė paskelbta vertė.



AsyncSubject<T>

"AsyncSubject" <T>yra paskutinis "Subject" brolis ir sesuo, kurį nagrinėsime šiame straipsnyje<T>, ir jis yra labai panašus į ankstesnius du ("ReplaySubject" ir "BehaviourSubject"), nes taip pat saugo rezultatus. Bet vėlgi yra reikšmingas skirtumas. AsyncSubject publikuoja paskutinę talpykloje esančią reikšmę tik tuo atveju, jei seka pažymėta kaip baigta <T> (talpykloje saugoma tik viena reikšmė, paskutinė reikšmė).

Apsvarstykite šį kodą.

Tai sugeneruos stebėtojui reikšmę, kad seka bus pažymėta kaip paskutinė iki užbaigimo paskelbta reikšmė - 4 reikšmė. Kaip parodyta paveikslėlyje žemiau.



Bet kas atsitiks, jei praleisime skambutį, kuris pažymi seką kaip baigtą? Pakomentuokime eilutę ir bandykime dar kartą.

Tai negeneruoja jokių duomenų stebėtojui, nes AsyncSubject<T> skelbia rezultatus tik po to, kai seka pažymima kaip baigta.



Tai yra reikšmingas skirtumas, kurį turėtų atsiminti visi, naudojantys "AsyncSubject<T>".

Išvada

Šis straipsnis parodo <T>skirtumus tarp įvairių Subjekto brolių ir seserų ir kai kurių jo variantų. Dažnai naudinga žinoti apie šiuos subtilius skirtumus, nes jie gali elgtis kitaip, nei tikėjotės, jei to nesuvokiate.

Originali nuoroda:Hipersaito prisijungimas matomas.





Ankstesnis:.NET/C# tikrina, ar yra TCP prievadas
Kitą:NSIS (1) Padaryti paprastą diegimo programą
 Savininkas| Paskelbta 2024-01-27 12:19:47 |
"Angular RxJS" temos prenumerata
https://www.itsvse.com/thread-9209-1-1.html
 Savininkas| Paskelbta 2024-04-28 11:36:59 |
"ASP.NET Core" naudoja "MediatR" tarpinį modelį
https://www.itsvse.com/thread-9272-1-1.html
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com