Programmēšana

Labākā prakse .Net asinhronajā programmēšanā

Asinhronā programmēšana ļauj veikt resursu ietilpīgas I / O operācijas bez nepieciešamības bloķēt lietojumprogrammas galveno vai izpildes pavedienu. Lai arī tas ir izdevīgi un šķietami viegli īstenojams, tas ir saistīts ar lielu sarežģītību un riskiem. Iespējamie riski, kas saistīti ar asinhrono programmēšanu, it īpaši nepareizas asinhronās programmēšanas izmantošanu, neievērojot ieteicamo praksi, ietver strupceļus, procesu avārijas un pat lēnu veiktspēju. Jums vajadzētu arī prasmīgi rakstīt, atkļūdot asinhrono kodu.

Async metodēs izvairieties no anulēšanas atgriešanās veida

Metode C # tiek izveidota par asinhronu metodi, izmantojot metodes parakstu asinhrono atslēgvārdu. Asinhronizācijas metodē var būt viens vai vairāki gaidītie atslēgvārdi. Apturēšanas atslēgvārds tiek izmantots, lai apzīmētu apturēšanas punktu. Async metodei C # var būt kāds no šiem atgriešanās veidiem: Uzdevums, Uzdevums un anulēšana. Async metodē tiek izmantots atslēgvārds "gaidīt", lai informētu kompilatoru, ka metodei var būt apturēšanas un atsākšanas punkts.

Ņemiet vērā, ka, lietojot TPL, atgriežamās spēkā neesamības ekvivalents TPL ir asinhronais uzdevums. Jums jāapzinās, ka async void ir un tas jāizmanto tikai asinhroniem notikumiem. Ja jūs to izmantojat jebkur citur, rodas kļūdas. Citiem vārdiem sakot, nav ieteicams izmantot asinhrono metodi, kuras atdošanas veids ir spēkā neesošs. jo asinhronajām metodēm, kas atgriež spēku, ir atšķirīga semantika, kad jūs strādājat ar izņēmumiem savā lietojumprogrammā.

Ja asinhronajā metodē, kurai ir atgriešanās veids Uzdevums vai Uzdevums, tiek veikts izņēmums, izņēmuma objekts tiek saglabāts objekta Uzdevums iekšpusē. Gluži pretēji, ja jums ir asinhronas metode ar atgriešanas veidu void, nav saistīts neviens uzdevuma objekts. Šādi izņēmumi tiek izvirzīti SynchronizationContext, kas bija aktīvs asinhronās metodes izsaukšanas laikā. Citiem vārdiem sakot, jūs nevarat apstrādāt izņēmumus, kas izvirzīti asinhronā anulēšanas metodē, izmantojot izņēmumu apstrādātājus, kas ierakstīti asinhronajā metodē. Šīs sinhronizācijas kļūdu apstrādes dēļ ir grūti pārbaudīt arī asinhronās metodes, kuru atgriešanas veids ir tukšs. Jūsu informācijai - SynchronizationContext klase sistēmā. Vārddaļas Threading attēlo sinhronizācijas kontekstu .Net un palīdz rindot uzdevumu uz citu kontekstu.

To ilustrē šāds kodu saraksts. Jums ir divas metodes, proti, Test un TestAsync, un pēdējā ir izņēmums.

sabiedrības klase AsyncDemo

   {

publiski anulēts tests ()

       {

mēģiniet

           {

TestAsync ();

           }

nozveja (izņēmums ex)

           {

Console.WriteLine (piem., Ziņojums);

           }

       }

privātā asinhronā anulēšana TestAsync ()

       {

mest jaunu izņēmumu ("Šis ir kļūdas ziņojums");

       }

   }

Lūk, kā jūs varat izveidot klases AsyncDemo instanci un izsaukt testa metodi.

static void Main (virkne [] args)

       {

AsyncDemo obj = jauns AsyncDemo ();

obj.Test ();

Konsole. Lasīt ();

       }

Pārbaudes metode izsauc TestAsync metodi, un izsaukums tiek iesaiņots izmēģinājuma ķeršanas blokā, lai apstrādātu TestAsync metodē izmesto izņēmumu. Tomēr izņēmums, kas tiek izmests TestAsync metodē, nekad netiks notverts, t.i., tiks apstrādāts zvanītāja metodes Test iekšpusē.

Izvairieties sajaukt asinhrono un sinhrono kodu

Jums nekad nevajadzētu būt sinhrona un asinhrona koda sajaukumam. Bloķēt asinhrono kodu, veicot zvanus uz Task.Wait vai Task.Result, ir slikta programmēšanas prakse. Es ieteiktu izmantot asinhrono kodu no gala līdz galam - tas ir drošākais veids, kā izvairīties no kļūdām.

Jūs varat izvairīties no strupceļiem, izmantojot.ConfigureAwait (turpinātOnCapturedContext: false) ikreiz, kad piezvanāt, lai gaidītu. Ja jūs to neizmantojat, asinhronā metode bloķētos brīdī, kad ir izsaukta gaidīšana. Šajā gadījumā jūs vienkārši informējat viesmīli, lai tas neuzņemtu pašreizējo kontekstu. Es teiktu, ka ir laba prakse izmantot .ConfigureAwait (false), ja vien jums nav īpaša iemesla to neizmantot.

Vairāk par asinhrono programmēšanu es apspriestu savos turpmākajos emuāra ierakstos šeit. Lai iegūtu papildinformāciju par asinhronās programmēšanas paraugpraksi, skatiet Stephen Cleary lielisko rakstu MSDN.

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