Ohjelmointi

Kuinka käyttää ValueTaskia C #: ssä

Asynkroninen ohjelmointi on ollut käytössä jo jonkin aikaa. Viime vuosina siitä on tehty entistä tehokkaampaa käyttöönotolla asynkronointi ja odota -avainsanat. Voit hyödyntää asynkronista ohjelmointia parantaaksesi sovelluksesi herkkyyttä ja suorituskykyä.

Asynkronisen menetelmän suositeltu palautustyyppi C #: ssä on Tehtävä. Sinun pitäisi palauttaa Tehtävä, jos haluat kirjoittaa asynkronisen menetelmän, joka palauttaa arvon. Jos haluat kirjoittaa tapahtumankäsittelijän, voit palauttaa sen sijaan tyhjäksi. Kunnes C # 7.0, asynkroninen menetelmä voi palauttaa tehtävän, tehtävän tai mitätöinnin. Asynkroninen menetelmä voi aloittaa C # 7.0: sta myös ValueTaskin (saatavana osana System.Threading.Tasks.Extensions-pakettia) tai ValueTask. Tämä artikkeli esittelee keskustelun siitä, miten voimme työskennellä ValueTaskin kanssa C #: ssä.

Jotta voit työskennellä tässä artikkelissa annettujen koodiesimerkkien kanssa, järjestelmässäsi on oltava asennettuna Visual Studio 2019. Jos sinulla ei vielä ole kopiota, voit ladata Visual Studio 2019 täältä.

Luo .NET Core -konsolisovellusprojekti Visual Studiossa

Ensinnäkin, luodaan .NET Core -konsolisovellusprojekti Visual Studiossa. Olettaen, että Visual Studio 2019 on asennettu järjestelmään, luo uusi .NET Core -konsolisovellusprojekti Visual Studiossa noudattamalla seuraavia ohjeita.

  1. Käynnistä Visual Studio IDE.
  2. Napsauta Luo uusi projekti.
  3. Valitse Luo uusi projekti -ikkunassa ”Console App (.NET Core)” näytetystä malliluettelosta.
  4. Napsauta Seuraava.
  5. Määritä seuraavan projektin nimi ja sijainti uuden Konfiguroi uusi projekti -ikkunassa.
  6. Napsauta Luo.

Tämä luo uuden .NET Core -konsolisovellusprojektin Visual Studio 2019: ssä. Tämän projektin avulla kuvataan ValueTaskin käyttöä tämän artikkelin seuraavissa osissa.

Miksi minun pitäisi käyttää ValueTaskia?

Tehtävä edustaa jonkin toiminnon tilaa, ts. Onko toiminto suoritettu loppuun, peruutettu jne. Asynkroninen menetelmä voi palauttaa joko Tehtävän tai ValueTaskin.

Koska Tehtävä on viitetyyppi, Task-objektin palauttaminen asynkronisesta menetelmästä tarkoittaa kohteen allokointia hallitulle kasalle aina, kun menetelmää kutsutaan. Siten yksi tehtävä Taskin käytöstä on se, että sinun on allokoitava muisti hallitussa kasassa aina, kun palautat Task-objektin metodistasi. Jos menetelmällä suoritettavan toiminnan tulos on saatavilla välittömästi tai se suoritetaan synkronisesti, tätä allokointia ei tarvita ja se tulee siksi kalliiksi.

Tässä on tarkalleen missä ValueTask tulee apuun. ValueTask tarjoaa kaksi pääetua. Ensinnäkin, ValueTask parantaa suorituskykyä, koska se ei tarvitse kasan allokointia, ja toiseksi se on sekä helppo että joustava toteuttaa. Palauttamalla ValueTask tehtävän sijaan asynkronisesta menetelmästä, kun tulos on heti käytettävissä, voit välttää allokoinnin tarpeettomat yleiskustannukset, koska T tarkoittaa tässä rakennetta ja rakenne C #: ssa on arvotyyppi (toisin kuin T luokkaa edustavassa tehtävässä).

Tehtävä ja ValueTask edustavat kahta ensisijaista "odottavaa" tyyppiä C #: ssä. Huomaa, että et voi estää ValueTaskia. Jos sinun on estettävä, sinun on muunnettava ValueTask Tehtäväksi AsTask-menetelmällä ja estettävä sitten kyseinen viitetehtävä-objekti.

Huomaa myös, että jokaista ValueTaskia voidaan käyttää vain kerran. Tässä sana "kuluttaa" tarkoittaa, että ValueTask voi asynkronisesti odottaa (odottaa) toiminnon päättymistä tai hyödyntää AsTaskia muunnettaessa ValueTask Tehtäväksi. ValueTaskia tulisi kuitenkin käyttää vain kerran, minkä jälkeen ValueTask tulisi jättää huomioimatta.

ValueTask-esimerkki C #: ssä

Oletetaan, että sinulla on asynkroninen menetelmä, joka palauttaa tehtävän. Voit hyödyntää Task.FromResult-toimintoa luodaksesi Tehtävä-objektin alla olevan koodinpätkän mukaisesti.

julkinen tehtävä GetCustomerIdAsync ()

{

return Task.FromResult (1);

}

Yllä oleva koodinpätkä ei luo koko asynkronisen tilakoneen taikuutta, mutta se allokoi Tehtävä-objektin hallittuun kasaan. Tämän välttämiseksi kannattaa ehkä hyödyntää ValueTaskia, kuten alla olevassa koodinpätkässä näkyy.

public ValueTask GetCustomerIdAsync ()

{

palauta uusi ValueTask (1);

}

Seuraava koodinpätkä kuvaa ValueTaskin synkronista toteutusta.

 julkinen käyttöliittymä IR-varasto

    {

ValueTask GetData ();

    }

Repository-luokka laajentaa IRepository-käyttöliittymää ja toteuttaa menetelmänsä alla olevan kuvan mukaisesti.

  julkisen luokan arkisto: IR-varasto

    {

julkinen ValueTask GetData ()

        {

var-arvo = oletus (T);

palauta uusi ValueTask (arvo);

        }

    }

Näin voit kutsua GetData-menetelmää päämenetelmästä.

staattinen void Main (merkkijono [] args)

        {

IR-varaston arkisto = uusi arkisto ();

var tulos = arkisto.GetData ();

if (tulos.IsCompleted)

Console.WriteLine ("Toiminta valmis ...");

muu

Console.WriteLine ("Toiminta keskeneräinen ...");

Console.ReadKey ();

        }

Lisätään nyt toinen menetelmä arkistoon, tällä kertaa asynkroninen menetelmä nimeltä GetDataAsync. Tältä näyttää muokattu IRepository-käyttöliittymä.

julkinen käyttöliittymä IR-varasto

    {

ValueTask GetData ();

ValueTask GetDataAsync ();

    }

GetDataAsync-menetelmän toteuttaa Repository-luokka alla olevan koodikatkelman mukaisesti.

  julkisen luokan arkisto: IR-varasto

    {

julkinen ValueTask GetData ()

        {

var-arvo = oletus (T);

palauta uusi ValueTask (arvo);

        }

julkinen asynkronointi ValueTask GetDataAsync ()

        {

var-arvo = oletus (T);

odota Tehtävä Viive (100);

palautusarvo;

        }

    }

Milloin minun pitäisi käyttää ValueTaskia C #: ssä?

Vaikka ValueTaskin edut ovatkin, ValueTaskin käytössä on tiettyjä kompromisseja Tehtävän sijaan. ValueTask on arvotyyppi, jossa on kaksi kenttää, kun taas Task on viitetyyppi, jolla on yksi kenttä. ValueTaskin käyttäminen tarkoittaa siis työskentelyä useamman datan kanssa, koska menetelmäpuhelu palauttaisi kaksi tietokenttää yhden sijasta. Lisäksi, jos odotat menetelmää, joka palauttaa ValueTaskin, myös kyseisen asynkronisen menetelmän tilakone olisi suurempi - koska sen pitäisi sijoittaa rakenne, joka sisältää kaksi kenttää yhden viitteen sijasta Tehtävän tapauksessa.

Lisäksi, jos asynkronisen menetelmän kuluttaja käyttää Task.WhenAll- tai Task.WhenAny-toimintoa, ValueTaskin käyttäminen palautustyypiksi asynkronisessa menetelmässä saattaa tulla kalliiksi. Tämä johtuu siitä, että sinun on muunnettava ValueTask tehtäväksi käyttämällä AsTask-menetelmää, mikä aiheuttaisi allokoinnin, joka voitaisiin helposti välttää, jos välimuistissa olevaa tehtävää olisi käytetty alun perin.

Tässä on peukalon sääntö. Käytä Tehtävä-toimintoa, kun sinulla on koodinpätkä, joka on aina asynkroninen, ts. Kun toimintoa ei suoriteta välittömästi. Hyödynnä ValueTaskia, kun asynkronisen toiminnan tulos on jo käytettävissä tai kun sinulla on jo välimuistitulos. Kummassakin tapauksessa sinun on suoritettava tarvittava suorituskykyanalyysi ennen kuin harkitset ValueTaskia.

Kuinka tehdä enemmän C #: ssä:

  • Kuinka käyttää muuttumattomuutta C: ssä
  • Kuinka käyttää const, readonly ja staattinen C #: ssä
  • Tietomerkintöjen käyttäminen C #: ssä
  • Kuinka käyttää GUID-tunnuksia C # 8: ssa
  • Milloin abstraktia luokkaa vs. käyttöliittymää käytetään C #: ssä
  • Kuinka työskennellä AutoMapperin kanssa C #: ssä
  • Kuinka käyttää lambda-lausekkeita C #: ssä
  • Kuinka toimia Action-, Func- ja Predicate-edustajien kanssa C #: ssä
  • Kuinka työskennellä C #: n edustajien kanssa
  • Kuinka toteuttaa yksinkertainen kirjaaja C #: ssä
  • Kuinka työskennellä attribuuttien kanssa C #: ssä
  • Kuinka työskennellä log4netin kanssa C #: ssä
  • Kuinka toteuttaa arkiston suunnittelumalli C #: ssä
  • Kuinka työskennellä heijastuksen kanssa C #: ssä
  • Kuinka työskennellä tiedostojärjestelmän katselijan kanssa C #: ssä
  • Kuinka tehdä laiska alustus C #: ssä
  • Kuinka työskennellä MSMQ: n kanssa C #: ssä
  • Kuinka työskennellä laajennusmenetelmien kanssa C #: ssä
  • Kuinka meille lambda-lausekkeet C #: ssä
  • Milloin haihtuvaa avainsanaa käytetään C #: ssä
  • Tuottoavainsanan käyttäminen C #: ssä
  • Kuinka toteuttaa polymorfismi C #: ssa
  • Kuinka rakentaa oma tehtävän ajastin C #
  • Kuinka työskennellä RabbitMQ: n kanssa C #: ssä
  • Kuinka työskennellä C #: n kanssa
  • Virtuaalisten ja abstraktien menetelmien tutkiminen C #: ssä
  • Kuinka käyttää Dapper ORMia C #: ssä
  • Lentopainokuvion käyttäminen C #: ssä