Ohjelmointi

Oppia synkronointia Konteksti, asynkronointi ja odota

Asynkroninen ohjelmointi on rinnakkaisen ohjelmoinnin muoto, jonka avulla voit suorittaa tehtäviä erillään pääsovellussäikeestä ja ilmoittaa sitten ketjulle, kun sen toteutus on ohi. Asynkronointi auttaa sinua suorittamaan tehtäviä, eikä tarvetta pitää yllä sovelluksesi suoritusvirtaa tai reagointikykyä.

Microsoft on tukenut rinnakkaista ohjelmointia .Net Frameworkissa hyödyntääkseen moniydinjärjestelmien edut. Voit hyödyntää asynkroniaa sovelluksesi suorituskyvyn ja reagoivuuden parantamiseksi.

Pohjimmiltaan sovelluksessa on kahta mahdollista toimintatyyppiä. Näitä ovat laskentaan sidotut ja I / O-sidotut toiminnot. Laskentaan sidotut operaatiot ovat niitä, joissa laskenta voidaan suorittaa erilliselle säikeelle, jotta pääkierre voi jatkaa sen suorittamista. Päinvastoin, I / O-sidotut toiminnot ovat niitä, joissa ne suoritetaan ulkoisesti, joten niiden ei tarvitse estää nykyistä ketjua I / O: n ollessa käynnissä.

Synkronointikonteksti ja suorituskonteksti

Jokaiseen säikeeseen liittyy konteksti - tämä tunnetaan myös nimellä "nykyinen" konteksti - ja nämä kontekstit voidaan jakaa ketjujen kesken. ExecutionContext sisältää olennaiset metatiedot nykyisestä ympäristöstä tai asiayhteydestä, jossa ohjelmaa suoritetaan. SynchronizationContext edustaa abstraktia - se tarkoittaa sijaintia, jossa sovelluksen koodi suoritetaan.

SynchronizationContext-toiminnon avulla voit jonottaa tehtävän toiseen kontekstiin. Huomaa, että jokaisella säikeellä voi olla oma SynchronizatonContext. SynchronizationContext-luokka on lisätty äskettäin System.threading-nimitilaan ja helpottaa viestintää ketjujen välillä. Voit lukea lisää SynchronizationContext- ja ExecutionContext-tiedostoista täältä.

Syvä sukellus Asyncin ja Odota sisällä

Kolme asynkronista ohjelmointikuviota sisältävät seuraavat:

  1. Asynkroninen ohjelmointimalli (APM)
  2. Tapahtumapohjainen asynkroninen kuvio (EAP)
  3. Tehtäväpohjainen asynkroninen kuvio (TAP)

Uusin, suositeltu ja tyylikkäin näistä kaikista on TAP.

Huomaa, että voit merkitä menetelmän käyttämällä async-avainsanaa, joka palauttaa void, Task tai Task. Huomaa, että kun poikkeus tapahtuu asynkronisessa menetelmässä, jonka palautustyyppi on Tehtävä tai Tehtävä, poikkeustiedot tallennetaan Tehtävä-ilmentymään.

Päinvastoin, kun poikkeus tapahtuu sellaisen asynkronisen menetelmän sisällä, jolla on palautustyyppi tyhjä, poikkeustiedot tallennetaan SynchronizationContextiin, joka oli aktiivinen asynkronisen menetelmän kutsumisajankohtana. Pohjimmiltaan et voi käsitellä asynkronisessa menetelmässä nostettuja poikkeuksia, joiden palautustyyppi on tyhjä, käyttämällä asynkronisen menetelmän sisällä kirjoitettuja poikkeuskäsittelijöitä. Erilaisten laskenta- ja virhekäsittelysemantiikan vuoksi on suositeltavaa välttää asynkronisilla menetelmillä mitätöityjä palautustyyppejä, ellei niiden käyttöön ole riittävää syytä.

Kun käytät "odota" -avainsanaa asynkronisessa menetelmässä, menetelmä jaetaan tilakoneeseen. Huomaa, että "odota" -avainsana sieppaa nykyisen SynchronizationContextin ja heti kun "odota" -avainsanalla odotettu tehtävä on valmis, tilakone jatkuu ja koodin suorittaminen soittajamenetelmässä käynnistyy uudelleen - tämä on tunnetaan jatkoa. Jos odottavan avainsanan avulla odotetun koodin suorittaminen on suoritettu keskeytyskohdan kohdatessa, asynkroninen menetelmä (menetelmä, joka on merkitty "asynkiksi") suoritetaan synkronisesti. Jos odotetun koodin suorittaminen ei ole valmis, odottavaan koodiin liitetään jatkoedustaja.

Voit hyödyntää asynkronisia menetelmiä, jotka palauttavat mitätön luoda asynkronisia tapahtumankäsittelijöitä. Main-menetelmää ei voida merkitä "async" -avainsanalla, koska se on sovelluksen lähtökohta - "async" -metodi lopettaa heti, kun sitä kutsutaan. "Odota" -avainsana ilmoittaa kääntäjälle, että menetelmällä voi olla keskeytys- ja jatkamispiste. Muuten, voit käyttää "odota" -avainsanaa vain menetelmässä, joka on merkitty asynkroniseksi käyttämällä "asynkki" -avainsanaa.

Asynkronointimenetelmä, kun sitä kutsutaan, toimii synkronisesti nykyisessä säikeessä menetelmän palautustyypistä riippumatta. Kun merkitset menetelmän asynkroniseksi käyttämällä asynkronointiavainta, ilmoitat kääntäjälle vain, että menetelmä voidaan jakaa useisiin tehtäviin - jotkut näistä tehtävistä voivat suorittaa asynkronisesti. Async-avainsanan sisällyttäminen menetelmään ei myöskään jonota menetelmän kutsua osana ketjujoukkoa. Asynkronia (ts. Onko menetelmällä asynkronista käyttäytymistä) riippuu tosiasiallisesti keskeytyskohdasta, jonka olet maininnut menetelmässäsi "odota" -avainsanalla. Jos et sisällytä "odota" -avainsanaa asynkroniseen menetelmään, koko menetelmä suoritettaisiin synkronisesti.

$config[zx-auto] not found$config[zx-overlay] not found