Programiranje

Učenje SynchronizationContext, async in await

Asinhrono programiranje je oblika vzporednega programiranja, ki omogoča izvajanje nalog ločeno od glavne niti aplikacije in nato obvesti nit, ko je njeno izvajanje končano. Asinhronost vam pomaga pri izvajanju nalog, razen če je treba zadrževati izvedbeni tok ali odzivnost vaše aplikacije.

Microsoft je zagotovil podporo za vzporedno programiranje v .Net Framework, da bi izkoristil prednosti večjedrnih sistemov. Asinhronost lahko uporabite za izboljšanje učinkovitosti in odzivnosti aplikacije.

V bistvu obstajata dve možnosti operacij v aplikaciji. Sem spadajo računsko vezane in vezane V / I operacije. Računalniško vezane operacije so tiste, pri katerih je mogoče izračunavanje izvajati na ločeni niti, tako da lahko glavna nit nadaljuje z izvajanjem. Nasprotno, vezane V / I operacije so tiste, pri katerih se izvajajo zunaj, zato jim ni treba blokirati trenutne niti, medtem ko V / I poteka.

Kontekst sinhronizacije in kontekst izvajanja

Z vsako nitjo je povezan kontekst - to je znano tudi kot "trenutni" kontekst - in te kontekste je mogoče deliti med nitmi. Kontekst ExecutionContext vsebuje ustrezne metapodatke trenutnega okolja ali konteksta, v katerem se izvaja program. SynchronizationContext predstavlja abstrakcijo - označuje mesto, kjer se izvaja koda vaše aplikacije.

SynchronizationContext vam omogoča, da opravilo postavite v čakalno vrsto v drug kontekst. Upoštevajte, da ima lahko vsaka nit svoj SynchronizatonContext. Razred SynchronizationContext je bil nedavno dodan v imenski prostor System.Threading in olajša komunikacijo med nitmi. Več o SynchronizationContext in ExecutionContext si lahko preberete tukaj.

Globok potop v Async in Await

Trije asinhroni vzorci programiranja vključujejo naslednje:

  1. Model asinhronega programiranja (APM)
  2. Asinhroni vzorec na osnovi dogodkov (EAP)
  3. Asinhroni vzorec na osnovi opravil (TAP)

Najnovejši, priporočeni in tudi najelegantnejši od vseh je TAP.

Upoštevajte, da lahko metodo označite s ključno besedo "async", ki vrne void, Task ali Task. Ko pride do izjeme znotraj asinhrone metode, ki ima vrnjeni tip opravila ali naloge, so podrobnosti o izjemi shranjene znotraj primerka opravila.

Nasprotno, kadar pride do izjeme znotraj asinhrone metode, ki ima vrnjeni tip praznine, se podrobnosti o izjemi shranijo v SynchronizationContext, ki je bila aktivna v času, ko je bila klicana asinhrona metoda. V bistvu ne morete obvladovati izjem, ustvarjenih v asinhroni metodi, ki ima vrnjeno vrsto praznine, z uporabo obdelovalcev izjem, zapisanih znotraj asinhrone metode. Zaradi različnih semantikov računalništva in ravnanja z napakami se je priporočljivo izogibati asinhronim metodam s praznimi vrstami vrnitve, razen če obstaja zadosten razlog za njihovo uporabo.

Ko v asinhroni metodi uporabite ključno besedo "await", je metoda razdeljena znotraj stanja stroja. Upoštevajte, da ključna beseda "await" zajame trenutni SynchronizationContext in takoj, ko je naloga, ki je bila pričakovana s pomočjo ključne besede "await", končana, se državni stroj nadaljuje in izvajanje kode v metodi klicatelja se ponovno zažene - znan kot nadaljevanje. Če je bila izvedba kode, ki je bila pričakovana z uporabo ključne besede "await", zaključena v času, ko je naletela na točko zadrževanja, se sinhrono izvede metoda (metoda, ki je bila označena kot "asinhrono"). Če izvedba čakane kode ni končana, je na čakajočo kodo priložen nadaljnji delegat.

Asinhrone metode, ki vrnejo prazno, lahko izkoristite za ustvarjanje asinhronih upravljavcev dogodkov. Metode Main ni mogoče označiti s ključno besedo "async", saj je vstopna točka aplikacije - "async" metoda Main se konča v trenutku, ko je poklicana. Ključna beseda "await" obvesti prevajalnika, da ima metoda lahko točko zadržanja in nadaljevanja. Mimogrede lahko ključno besedo "await" uporabite samo pri metodi, ki je bila s ključno besedo "async" označena kot asinhrona.

Ko se pokliče, asinhronska metoda deluje sinhrono na trenutni niti, ne glede na vrsto vrnitve metode. Ko označite metodo kot asinhrono s ključno besedo "async", samo obvestite prevajalnika, da je metodo mogoče razdeliti na več nalog - nekatere od teh nalog se lahko izvajajo asinhrono. Vključitev ključne besede "async" v metodo ne prikliče klica metode v čakalno vrsto kot del področja niti. Asinhronost (tj. Ali bi metoda imela asinhrono vedenje) je dejansko odvisna od točke suspenzije, ki ste jo omenili v metodi z uporabo ključne besede "await". Če ključne besede "await" ne vključite v asinhrono metodo, bi se celotna metoda izvajala sinhrono.

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