Programmēšana

Mācīties sinhronizāciju Konteksts, asinhronizācija un gaidīšana

Asinhronā programmēšana ir paralēlas programmēšanas veids, kas ļauj izpildīt uzdevumus atsevišķi no galvenā lietojumprogrammas pavediena un pēc tam paziņo pavedienam, kad tā izpilde ir beigusies. Asinhronitāte palīdz izpildīt uzdevumus, un tas nenozīmē nepieciešamību aizkavēt lietojumprogrammas izpildes plūsmu vai atsaucību.

Microsoft ir nodrošinājis atbalstu .Net Framework paralēlai programmēšanai, lai izmantotu daudzkodolu sistēmu priekšrocības. Lai uzlabotu lietojumprogrammas veiktspēju un atsaucību, varat izmantot asinhronitāti.

Būtībā lietojumprogrammā ir divi iespējamie darbību veidi. Tie ietver skaitļošanas un I / O saistītās darbības. Ar skaitļošanu saistītas darbības ir tās, kurās aprēķinu var veikt atsevišķā pavedienā, lai galveno pavedienu varētu turpināt izpildīt. Gluži pretēji, I / O saistītās darbības ir tās, kuras tiek veiktas ārēji, un tāpēc tām nav nepieciešams bloķēt pašreizējo pavedienu, kamēr I / O notiek.

Sinhronizācijas konteksts un izpildes konteksts

Katram pavedienam ir saistīts konteksts - to sauc arī par "pašreizējo" kontekstu - un šos kontekstus var koplietot dažādos pavedienos. ExecutionContext satur attiecīgos pašreizējās vides vai konteksta, kurā programma tiek izpildīta, metadatus. SynchronizationContext apzīmē abstrakciju - tā norāda vietu, kur tiek izpildīts jūsu lietojumprogrammas kods.

SynchronizationContext ļauj rindot uzdevumu uz citu kontekstu. Ņemiet vērā, ka katram pavedienam var būt savs SynchronizatonContext. Nesen sistēmai tika pievienota klase SynchronizationContext. Vārdvietas vītne un atvieglo saziņu starp pavedieniem. Vairāk par SynchronizationContext un ExecutionContext varat lasīt šeit.

Dziļa niršana Async un Await iekšpusē

Trīs asinhronie programmēšanas modeļi ietver:

  1. Asinhronās programmēšanas modelis (APM)
  2. Uz notikumiem balstīts asinhronais modelis (EAP)
  3. Uzdevumu bāzes asinhronais modelis (TAP)

Jaunākais, ieteicamais un arī elegantākais no šiem visiem ir TAP.

Ņemiet vērā, ka metodi var atzīmēt, izmantojot atslēgvārdu async, kas atgriež void, Task vai Task. Ņemiet vērā, ka tad, kad izņēmums notiek asinhronajā metodē, kuras atgriešanas veids ir Uzdevums vai Uzdevums, informācija par izņēmumu tiek saglabāta uzdevuma instancē.

Tieši pretēji, ja izņēmums rodas asinhronajā metodē, kuras atgriešanās veids ir tukšs, izņēmuma informācija tiek glabāta SynchronizationContext, kas bija aktīva laikā, kad tika izsaukta asinhronā metode. Būtībā jūs nevarat apstrādāt izņēmumus, kas izvirzīti asinhronajā metodē ar atdošanas veida atcelšanu, izmantojot izņēmumu apstrādātājus, kas ierakstīti asinhronajā metodē. Dažādās skaitļošanas un kļūdu apstrādes semantikas dēļ ieteicams izvairīties no asinhronām metodēm, kurās nav spēkā atgriezeniskās saites veidi, ja vien nav pietiekama iemesla to izmantošanai.

Kad asinhronajā metodē izmantojat atslēgvārdu "gaidīt", metode tiek sadalīta štata mašīnā. Ņemiet vērā, ka atslēgvārds "gaidīt" uztver pašreizējo SynchronizationContext un, tiklīdz uzdevums, kas tika gaidīts, izmantojot atslēgvārdu "gaidīt", ir pabeigts, tiek atjaunota stāvokļa mašīna un koda izpilde zvanītāja metodē tiek atsākta - tas ir arī pazīstams kā turpinājums. Ja koda izpilde, izmantojot atslēgvārdu "gaidīt", ir pabeigta brīdī, kad rodas apturēšanas punkts, asinhronā metode (metode, kas atzīmēta kā "asinhrona") tiek izpildīta sinhroni. Ja gaidītā koda izpilde nav pabeigta, gaidītajam kodam tiek pievienots turpināšanas pārstāvis.

Varat izmantot asinhrono metožu priekšrocības, kas atgriež spēku, lai izveidotu asinhronus notikumu apstrādātājus. Galveno metodi nevar atzīmēt ar atslēgvārdu "async", jo tas ir lietojumprogrammas ieejas punkts - metode "async" pārtrauc brīdi, kad tā tiek izsaukta. Atslēgvārds "gaidīt" informē sastādītāju, ka metodei var būt apturēšanas un atsākšanas punkts. Starp citu, atslēgvārdu "gaidīt" varat izmantot tikai metodei, kas ir atzīmēta kā asinhrona, izmantojot atslēgvārdu "asinhronais".

Asinc metode, kad tā tiek izsaukta, sinhroni darbojas pašreizējā pavedienā neatkarīgi no metodes atgriešanas veida. Atzīmējot metodi kā asinhronu, izmantojot atslēgvārdu "asinhronais", jūs vienkārši informējat kompilatoru, ka metodi var sadalīt vairākos uzdevumos - dažus no šiem uzdevumiem var izpildīt asinhroni. Arī atslēgvārda “asinhronais” iekļaušana metodē neievieto rindā metodes izsaukumu kā daļu no pavedienu kopas. Asinhronija (t.i., vai metodei būtu asinhrona darbība) faktiski ir atkarīga no apturēšanas punkta, kuru esat pieminējis savā metodē, izmantojot atslēgvārdu "gaidīt". Ja asinhronajā metodē neiekļaujat atslēgvārdu "gaidiet", visa metode tiks izpildīta sinhroni.

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