Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 15343|Válasz: 2

[Kommunikáció] [Fordítás]. NET a ValueTask és a Task közötti különbség használatára

[Linket másol]
Közzétéve: 2022-3-17 11:21:50 | | | |


A Feladat vagy Feladat osztályok használatának teljesítménykorlátozott szűk keresztmetszete van, amit korábban nem említettünk. Röviden, ezek az órák akkor vezetnek, amikor az eredmények azonnal elérhetőkFelesleges allokáció。 Ez azt jelenti, hogy mindig új Feladat vagy Feladatobjektum jön létre, még akkor is, ha az eredmény már elérhető. Már említettük, hogy az aszinkron/várakozó koncepció, amit korábbi cikkekben használtunk, már a .NET 4.5 kiadása óta létezik. Ezt a funkciót a C# 7 óta fejlesztették a .NET 4.7 verzióval, amely a ValueTask struktúrával rendelkezik, és amely aszinkron függvények visszatérítésére használható.

ValueTask struktúra


A ValueTask struktúra először 2015-ben jelent meg a corefxlab repozióriumban. Ezt a reponytárt új ötletek kísérletezésére és felfedezésére használják, amelyek eljuthatnak vagy nem jutnak el a fő corefx tárhoz. A Corefx tároló az a tároló, ahol az összes .NET Core alapkönyvtár található. Stephen Taub fejlesztette és javasolta a System.Threading.Tasks.Channels könyvtárhoz. Ekkor Stephen rövid magyarázatot adott:

Corefxlab könyvtár címe:A hiperlink bejelentkezés látható.


A ValueTask egy T és egy Feladat különálló uniója, lehetővé téve a ReadAsync számára, hogy szabadon kioszthasson elérhető T értékeinek szinkronszerű visszacsatolásához (ellentétben a Task.FromResult használatával, amely egy Feladat példány kiosztását igényli). A ValueTask várakozásra alkalmas, így a legtöbb példány fogyasztása megkülönböztethetetlen a feladatok fogyasztásától.
Sokan látják ennek a struktúrának az előnyeit, amely a C# 7-ben található a System.Threading.Tasks.Extensions NuGet csomag részeként. Mielőtt belemerülnénk az ValueTask struktúrába, nézzük meg azt a problémát, amelyet az eszközzel próbál megoldani. Mivel a Feladat (feladat) referenciatípus, kezdjükAz aszinkron metódus, amely a Feladatobjektumot adja, azt jelenti, hogy minden alkalommal a halomon van kiosztva.。 Ez sok esetben szükséges.

Azonban bizonyos esetekben az aszinkron módszerek azonnal vagy teljesen szinkronosan adnak eredményt. Ilyen esetekben ez a kiosztás felesleges, és a kód teljesítménykritikus részeiben költségessé válhat. A .NET 4.7 kiadásig nem volt mód ennek elkerülésére, mivel az aszinkron metódusoknak vissza kellett adniuk a Task, Task <T>vagy void (az utóbbi általában nem volt kívánatos). Ebben a .NET verzióban ez kiterjesztett, vagyis egy aszinkron metódus bármilyen típust visszaadhat, amennyiben elérhető GetAwaiter metódus van. A ValueTask egy konkrét példa erre a típusra, és ezt is hozzáadták ebbe a kiadásba.

Böngészhetsz a corefx repozióriumban, és megtekintheted a ValueTask teljes megvalósítását, íme az API szekció, ami érdekel, amit érdekelünk:



Struktúráként a ValueTask lehetővé teszi aszinkron metódusok írását, amelyek nem osztanak memóriát a szinkron futás idején. Az aszinkron/várakozás koncepciójának API konzisztenciája nem sérül ennek. Ezen felül ez a szerkezet önállóan vár, így könnyen használható. Például, ha ezt az egyszerű kódot futtatjuk:

A MultiplyAsync módszerben egy olyan helyzetet szimulálunk, ahol el akarjuk kerülni a Feladat használatát, és csak egy egyszerű egész számot adunk vissza. Ez a metódus if utasításában történik, ahol lényegében ellenőrizzük, hogy a megadott paraméter nulla-e. A probléma aMég ha az if feltételünk is igaz, a fenti kód létrehoz egy Task objektumot。 Ezt a problémát így oldjuk meg:

ValueTask és Feladat



Ahogy korábban említettük, a ValueTask használatának két fő előnye van:

  • Teljesítményfejlesztések
  • Növeljék a megvalósítás rugalmasságát


Szóval, mik a teljesítményjavulások mögötti számok? Figyeld meg ezt a kódot:


Ha ezt a kódot futtatjuk, 120 ns-be telik a JIT futtatása. Most, ha a Task-ot így cseréljük ValueTask-ra:

A JIT-tel 65 ns végrehajtási időt kapunk. Igaz, hogy a Task.Delay miatt nem szinkronban hajtunk végre, de javulást tapasztalunk a végrehajtási időben.

Egy másik említett előny a megnövekedett rugalmasság a megvalósításban. Mit is jelent ez pontosan? Nos, azoknak az aszinkron interfészeknek a szinkronizáltnak kell megvalósításai, amelyek kénytelenek lesznek a Task.Run vagy Task.FromResult használatára. Természetesen ez vezet a korábban tárgyalt teljesítményproblémákhoz. Amikor a ValueTask-ot használjuk, nagyobb eséllyel választunk szinkron vagy aszinkron megvalósítás között. Ne feledd, hogy ez annak a jele lehet, hogy a kódod nem van jól megtervezve, ha ez veled történik.

Például figyeljük meg ezt a felületet:


Tegyük fel, hogy így hívod a kódból:

Mivel a ValueTask-ot használjuk az interfészben, az interfész megvalósítása szinkron vagy aszinkron lehet. Ezt az előnyt úgy is elérhetjük, hogy gyakorlatilag kihagyunk néhány szinkronizálási viselkedést kezelő függvényt hozzáadni az IThinghez. Sokkal könnyebb így használni ezt a felületet. Íme a fenti interfész szinkron megvalósítása:

Íme egy aszinkron megvalósítás ugyanannak az interfésznek:

Azonban néhány kompromisszumot figyelembe kell vennünk, mielőtt a ValueTaskot használnánk. Könnyű azt gondolni, hogy alapértelmezettségben a ValueTask-ot kellene használni a Task helyett, ami biztosan nem így van. Például, bár a ValueTask segít elkerülni a felesleges hozzárendeléseket, amikor az eredmény szinkronizációja elérhető, két mezőt is tartalmaz.

Fontos emlékezni arra, hogy ezt a struktúrát használjuk, ami azt jelenti, hogy értéktípusokat és azok terheit használunk. A feladat viszont egy referenciatípus, amelynek csak egy mezője van.Ha a ValueTask-ot használjuk, több adatot kell feldolgoznunk és feldolgozni. Ha egy ilyen módszert várunk egy aszinkron módszerben, akkor az aszinkron módszer aAz állami gép is nagyobb lesz, mert az egész szerkezet tárolása általában több helyet igényel, mint egyetlen referencia tárolása.

Ezért javasolják a Microsoftnál a Task vagy Task alapértelmezett visszatérési típusként az aszinkron módszerekhez. Csak teljesítményelemzés után érdemes átgondolni a ValueTask-ra.


összefoglalás

A ValueTask egy olyan struktúra, amelyet a .NET 4.7-ben vezettek be, és amely számos lehetőséget kínál aszinkron módszerek használatára a .NET-ben. Ennek azonban nem ártalan. Ez hasznos olyan teljesítménykritikus módszerekhez, amelyeket szinkronban hajtanak végre. Velük elkerülhetjük, hogy felesleges objektumokat rendeljünk hozzá. Mégis, mint értéktípus, minden problémával jár, amikkel általában az értéktípusok szembesülnek. Ezért profitálhatunk ebből a struktúrából, de óvatosnak kell lennünk.

Eredeti cím:A hiperlink bejelentkezés látható.




Előző:【Practical Action】Use Docker to build an IPsec VPN server
Következő:Használd az OpenConnect a Cisco AnyConnect helyett, hogy elkerüld az útvonali táblazárokat
Közzétéve: 2022-3-18 22:21:57 |
Gyere újra tanulni.
Közzétéve: 2022-3-22 14:05:53 |
Ismerd meg a tanulás lényegétNem rossz
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com