Programavimas

Kaip naudoti „ValueTask“ C #

Asinchroninis programavimas buvo naudojamas gana ilgą laiką. Pastaraisiais metais jis tapo galingesnis įvedus asinchroninius ir laukimo raktinius žodžius. Norėdami padidinti savo programos reagavimą ir pralaidumą, galite pasinaudoti asinchroninio programavimo pranašumais.

Rekomenduojamas asinchroninio metodo grąžinimo tipas C # yra Užduotis. Turėtumėte grąžinti Užduotis, jei norite parašyti asinchroninį metodą, kuris grąžina vertę. Jei norite parašyti įvykių tvarkytuvą, galite grąžinti negaliojančią. Kol C # 7.0, asinchroninis metodas gali grąžinti užduotį, užduotį arba negaliojančią. Pradedant nuo C # 7.0, asinchroninis metodas taip pat gali grąžinti „ValueTask“ (galima kaip „System.Threading.Tasks.Extensions“ paketo dalį) arba „ValueTask“. Šiame straipsnyje aptariama, kaip mes galime dirbti su „ValueTask“ C #.

Norėdami dirbti su šiame straipsnyje pateiktais kodų pavyzdžiais, sistemoje turite būti įdiegę „Visual Studio 2019“. Jei dar neturite kopijos, galite atsisiųsti „Visual Studio 2019“ čia.

„Visual Studio“ sukurkite .NET Core konsolės programos projektą

Pirmiausia sukurkime .NET Core konsolės programos projektą „Visual Studio“. Darant prielaidą, kad „Visual Studio 2019“ yra įdiegta jūsų sistemoje, atlikite toliau nurodytus veiksmus, kad sukurtumėte naują .NET Core konsolės programos projektą „Visual Studio“.

  1. Paleiskite „Visual Studio IDE“.
  2. Spustelėkite „Sukurti naują projektą“.
  3. Lange „Kurti naują projektą“ iš rodomų šablonų sąrašo pasirinkite „Console App (.NET Core)“.
  4. Spustelėkite Pirmyn.
  5. Tada rodomame lange „Konfigūruoti naują projektą“ nurodykite naujo projekto pavadinimą ir vietą.
  6. Spustelėkite Sukurti.

Tai sukurs naują „.NET Core“ konsolės programos projektą „Visual Studio 2019“. Šį projektą naudosime iliustruodami „ValueTask“ naudojimą tolesniuose šio straipsnio skyriuose.

Kodėl turėčiau naudoti „ValueTask“?

Užduotis nurodo tam tikros operacijos būseną, ty ar operacija baigta, atšaukta ir pan. Asinchroninis metodas gali grąžinti užduotį arba „ValueTask“.

Kadangi užduotis yra nuorodos tipas, užduoties objekto grąžinimas iš asinchroninio metodo reiškia, kad objektas paskirstomas valdomam krūvui kiekvieną kartą, kai iškviečiamas metodas. Taigi, naudojant „Task“ yra vienas įspėjimas, kad valdomame kaupe reikia skirti atmintį kiekvieną kartą, kai grąžinate užduoties objektą iš metodo. Jei operacijos, atliekamos pagal jūsų metodą, rezultatas yra pasiekiamas nedelsiant arba užbaigiamas sinchroniškai, šio paskirstymo nereikia, todėl jis brangiai kainuoja.

Čia tiksliai gelbsti „ValueTask“. „ValueTask“ teikia du pagrindinius pranašumus. Pirma, „ValueTask“ pagerina našumą, nes jam nereikia kaupimo paskirstymo, antra, jį lengva ir lanksčiai įgyvendinti. Kai iš asinchroninio metodo grąžinate „ValueTask“, o ne iš asinchroninio metodo, kai rezultatas iškart pasiekiamas, galite išvengti nereikalingos paskirstymo pridėtinės sumos, nes „T“ čia reiškia struktūrą, o „C #“ struktūra yra vertės tipas (priešingai nei „T“ klasėje reprezentuojančioje užduotyje).

Užduotis ir „ValueTask“ rodo du pagrindinius „laukiamus“ tipus C #. Atminkite, kad negalite užblokuoti „ValueTask“. Jei reikia užblokuoti, turėtumėte konvertuoti „ValueTask“ į užduotį naudodami „AsTask“ metodą ir užblokuoti tą nuorodos užduoties objektą.

Taip pat atkreipkite dėmesį, kad kiekvieną „ValueTask“ galima suvartoti tik vieną kartą. Čia žodis „vartoti“ reiškia, kad „ValueTask“ gali asinchroniškai laukti (laukti) operacijos pabaigos arba pasinaudoti „AsTask“ pranašumais, kad „ValueTask“ paverstų užduotimi. Tačiau „ValueTask“ turėtų būti suvartojama tik vieną kartą, po to „ValueTask“ reikėtų nepaisyti.

„ValueTask“ pavyzdys C #

Tarkime, kad turite asinchroninį metodą, kuris pateikia užduotį. Galite naudoti „Task.FromResult“ pranašumus, kad sukurtumėte užduoties objektą, kaip parodyta toliau pateiktame kodo fragmente.

viešoji užduotis „GetCustomerIdAsync“ ()

{

grįžti Užduotis.Nuo Rezultato (1);

}

Aukščiau pateiktas kodo fragmentas nesukuria visos asinchroninės būsenos mašinos magijos, tačiau valdomame krūvoje jis paskirsto užduoties objektą. Norėdami išvengti šio paskirstymo, galbūt norėsite pasinaudoti „ValueTask“ pranašumais, kaip parodyta toliau pateiktame kodo fragmente.

public ValueTask GetCustomerIdAsync ()

{

grąžinti naują „ValueTask“ (1);

}

Šis kodo fragmentas iliustruoja sinchroninį „ValueTask“ įgyvendinimą.

 viešoji sąsaja IR saugykla

    {

„ValueTask“ „GetData“ ();

    }

„Repository“ klasė praplečia „IRepository“ sąsają ir įgyvendina savo metodus, kaip parodyta žemiau.

  viešosios klasės saugykla: IR saugykla

    {

viešoji „ValueTask“ „GetData“ ()

        {

var reikšmė = numatytasis (T);

grąžinti naują „ValueTask“ (vertė);

        }

    }

Štai kaip galite iškviesti „GetData“ metodą iš pagrindinio metodo.

static void Main (string [] args)

        {

IR saugyklos saugykla = nauja saugykla ();

var rezultatas = saugykla.GetData ();

jei (rezultatas. Baigta)

Console.WriteLine ("Operacija baigta ...");

Kitas

Console.WriteLine ("Operacija nebaigta ...");

Pultas.ReadKey ();

        }

Dabar prie savo saugyklos pridėkime dar vieną metodą, šį kartą asinchroninį metodą pavadinimu „GetDataAsync“. Štai kaip atrodys modifikuota „IRepository“ sąsaja.

viešoji sąsaja IR saugykla

    {

„ValueTask“ „GetData“ ();

„ValueTask“ „GetDataAsync“ ();

    }

„GetDataAsync“ metodą įgyvendina „Repository“ klasė, kaip parodyta toliau pateiktame kodo fragmente.

  viešosios klasės saugykla: IR saugykla

    {

viešoji „ValueTask“ „GetData“ ()

        {

var reikšmė = numatytasis (T);

grąžinti naują „ValueTask“ (vertė);

        }

viešasis asinchroninis „ValueTask“ „GetDataAsync“ ()

        {

var reikšmė = numatytasis (T);

palaukite Užduotis. Vėlavimas (100);

grąžos vertė;

        }

    }

Kada turėčiau naudoti „ValueTask“ C #?

Nors ir „ValueTask“ teikiama nauda, ​​vietoj „Task“ yra tam tikrų kompromisų naudojant „ValueTask“. „ValueTask“ yra vertės tipas su dviem laukais, o „Užduotis“ yra nuorodos tipas su vienu lauku. Taigi naudojant „ValueTask“ reiškia dirbti su daugiau duomenų, nes metodo iškvietimas grąžins du duomenų laukus vietoj vieno. Be to, jei laukiate metodo, kuris grąžina „ValueTask“, būsenos mašina tam asinchroniniam metodui taip pat būtų didesnė, nes užduoties atveju ji turės talpinti struktūrą, kurioje yra du laukai vietoj vienos nuorodos.

Be to, jei asinchroninio metodo vartotojas naudoja „Task.WhenAll“ arba „Task.WhenAny“, naudojant „ValueTask“ kaip grąžinimo tipą asinchroniniame metode gali būti brangu. Taip yra todėl, kad turėtumėte konvertuoti „ValueTask“ į „Task“ naudodami „AsTask“ metodą, o tai atliktų paskirstymą, kurio būtų galima lengvai išvengti, jei pirmiausia būtų naudojama talpykloje užduotis.

Čia yra nykščio taisyklė. Naudokite užduotį, kai turite kodo dalį, kuri visada bus asinchroninė, t. Y. Kai operacija nebus iš karto baigta. Pasinaudokite „ValueTask“ pranašumais, kai asinchroninės operacijos rezultatas jau pasiekiamas arba kai jau turite talpyklos rezultatą. Bet kokiu atveju prieš atlikdami „ValueTask“, turėtumėte atlikti reikiamą našumo analizę.

Kaip padaryti daugiau C #:

  • Kaip naudoti nekintamumą C
  • Kaip naudoti const, readonly ir static C #
  • Kaip naudoti duomenų komentarus C #
  • Kaip dirbti su GU # C # 8
  • Kada naudoti abstrakčią klasę ir sąsają C #
  • Kaip dirbti su „AutoMapper“ C #
  • Kaip naudoti lambda išraiškas C #
  • Kaip dirbti su „Action“, „Func“ ir „Predicate“ delegatais C #
  • Kaip dirbti su delegatais C #
  • Kaip įdiegti paprastą kaupiklį C #
  • Kaip dirbti su atributais C #
  • Kaip dirbti su „Log4net“ C #
  • Kaip įgyvendinti saugyklos dizaino modelį C #
  • Kaip dirbti su atspindžiu C #
  • Kaip dirbti su failų stebėjimo programa C #
  • Kaip atlikti tingų inicializavimą C #
  • Kaip dirbti su MSMQ C #
  • Kaip dirbti su plėtinių metodais C #
  • Kaip mums lambda išraiškos C #
  • Kada naudoti nepastovų raktinį žodį C #
  • Kaip naudoti pajamingumo raktinį žodį C #
  • Kaip įgyvendinti polimorfizmą C #
  • Kaip sukurti savo užduočių planavimo priemonę C #
  • Kaip dirbti su „RabbitMQ“ C #
  • Kaip dirbti su dvigubu C #
  • Naršyti virtualius ir abstrakčius metodus C #
  • Kaip naudoti Dapper ORM C #
  • Kaip naudoti „flyweight“ dizaino modelį C #
$config[zx-auto] not found$config[zx-overlay] not found