Učenje SynchronizationContext, async i await

Asinkrono programiranje oblik je paralelnog programiranja koji vam omogućuje izvršavanje zadataka odvojeno od glavne aplikacijske niti, a zatim obavještava nit kada je njegovo izvršavanje završeno. Asinkronost vam pomaže u izvršavanju zadataka bez potrebe za zadržavanjem tijeka izvršavanja ili odzivom vaše aplikacije.

Microsoft je pružio podršku za paralelno programiranje u .Net Frameworku kako bi iskoristio prednosti višejezgrenih sustava. Možete iskoristiti asinkronost za poboljšanje performansi i brzine vašeg programa.

U osnovi postoje dvije moguće vrste operacija u aplikaciji. Uključuju računski vezane i I / O vezane operacije. Operacije vezane uz izračunavanje su one u kojima se izračunavanje može izvesti na zasebnoj niti tako da glavna nit može nastaviti sa svojim izvršavanjem. Suprotno tome, I / O vezane operacije su one u kojima se izvršavaju izvana i stoga im nije potrebno blokirati trenutnu nit dok je I / O u tijeku.

Kontekst sinkronizacije i kontekst izvršenja

Svaka nit ima povezan kontekst - to je također poznato kao "trenutni" kontekst - i ti se konteksti mogu dijeliti između niti. Izvršni kontekst sadrži relevantne metapodatke o trenutnom okruženju ili kontekstu u kojem se program izvršava. SynchronizationContext predstavlja apstrakciju - označava mjesto na kojem se izvršava kôd vaše aplikacije.

SynchronizationContext omogućuje vam postavljanje zadatka u drugi kontekst. Imajte na umu da svaka nit može imati svoj SynchronizatonContext. Klasa SynchronizationContext nedavno je dodana u prostor imena System.Threading i olakšava komunikaciju između niti. Ovdje možete pročitati više o SynchronizationContext i ExecutionContext.

Duboko zaronite u Async i Await

Tri asinkrona programska uzorka uključuju sljedeće:

  1. Model asinkronog programiranja (APM)
  2. Asinhroni obrazac zasnovan na događajima (EAP)
  3. Asinkroni obrazac zasnovan na zadacima (TAP)

Najnoviji, preporučeni i najelegantniji od svih ovih je TAP.

Napominjemo da metodu možete označiti pomoću ključne riječi "async" koja vraća void, Task ili Task. Imajte na umu da kada se izuzetak dogodi unutar asinkrone metode koja ima povratni tip Zadatak ili Zadatak, detalji o iznimci pohranjuju se unutar instance Zadatak.

Suprotno tome, kada se izuzetak dogodi unutar asinkrone metode koja ima povratni tip praznine, detalji iznimke pohranjuju se unutar SynchronizationContext-a koji je bio aktivan u vrijeme kada je asinhrona metoda pozvana. U osnovi, ne možete se nositi s iznimkama podignutim unutar asinkrone metode koja ima povratnu vrstu praznine koristeći obrade izuzetaka napisane unutar asinkrone metode. Zbog različite semantike računanja i rukovanja pogreškama, preporučljivo je izbjegavati asinkrone metode s praznim vrstama povratka, osim ako postoji dovoljan razlog za njihovu upotrebu.

Kada koristite ključnu riječ "await" unutar asinkrone metode, metoda je podijeljena unutar stanja stroja. Imajte na umu da ključna riječ "await" bilježi trenutni SynchronizationContext i čim je zadatak koji se čekao pomoću ključne riječi "await" završen, državni stroj se nastavlja i izvršavanje koda u metodi pozivatelja se ponovno pokreće - to je također poznat kao nastavak. Ako je izvršenje koda na koji se čekalo pomoću ključne riječi "await" dovršeno u trenutku kada se naiđe na točku suspenzije, asinkrona metoda (metoda koja je označena kao "asinkrono") izvršava se sinkrono. Ako izvršavanje koda koji se čeka nije dovršeno, uz kôd koji se čekao pridružen je dodatak za nastavak.

Možete iskoristiti asinkrone metode koje vraćaju prazninu za stvaranje asinkronih obrađivača događaja. Glavna metoda ne može se označiti ključnom riječi "async", jer je to ulazna točka aplikacije - "async" glavna metoda prekinula bi se u trenutku kada je pozvana. Ključna riječ "await" obavještava sastavljača da metoda može imati točku suspenzije i nastavka. Inače, ključnu riječ "await" možete koristiti samo za metodu koja je označena kao asinkrona pomoću ključne riječi "async".

Async metoda kada se pozove, sinkrono se izvodi na trenutnoj niti, bez obzira na vrstu povratka metode. Kada metodu označite asinkronom pomoću ključne riječi "async", samo obavještavate sastavljač da se metoda može podijeliti u više zadataka - neki od tih zadataka mogu se izvršavati asinkrono. Također, uključivanje ključne riječi "async" u metodu ne dovodi u red pozivanje metode kao dio spremišta niti. Asinkronost (tj. Hoće li metoda imati asinkrono ponašanje) zapravo ovisi o točki suspenzije koju ste spomenuli u metodi pomoću ključne riječi "await". Ako ključnu riječ "await" ne uključite u asinkronu metodu, cijela će se metoda izvršavati sinkrono.