Programovanie

Najlepšie postupy v asynchrónnom programovaní .Net

Asynchrónne programovanie vám umožňuje vykonávať I / O operácie náročné na zdroje bez toho, aby ste museli blokovať hlavné alebo vykonávajúce vlákno aplikácie. Aj keď je to prospešné a zdá sa ľahko implementovateľné, prináša to veľa zložitosti a rizík. Medzi potenciálne riziká spojené s asynchrónnym programovaním, najmä nesprávnym používaním asynchrónneho programovania pri nedodržiavaní odporúčaných postupov, patria zablokovania, zlyhania procesov alebo dokonca pomalý výkon. Mali by ste tiež ovládať písanie a ladenie asynchrónneho kódu.

V asynchrónnych metódach sa vyhnite neplatnému typu návratu

Metóda v C # sa robí asynchrónnou metódou pomocou kľúčového slova async v podpise metódy. V asynchronnej metóde môžete mať jedno alebo viac kľúčových slov. Kľúčové slovo await sa používa na označenie bodu pozastavenia. Asynchronná metóda v C # môže mať ktorýkoľvek z týchto návratových typov: Task, Task a void. Kľúčové slovo „await“ sa používa v asynchronnej metóde na informovanie kompilátora o tom, že metóda môže mať bod pozastavenia a obnovenia.

Upozorňujeme, že pri použití TPL je ekvivalentom návratu void v TPL asynchronná úloha. Mali by ste vedieť, že async void je a mal by sa používať iba pre asynchronné udalosti. Ak by ste ho použili kdekoľvek inde, narazili by ste na chyby. Inými slovami, asynchronná metóda, ktorá má ako návratový typ void, sa neodporúča. pretože asynchronné metódy, ktoré vracajú neplatné, majú inú sémantiku, keď pracujete s výnimkami vo svojej aplikácii.

Ak dôjde k výnimke v asynchronnej metóde, ktorá má návratový typ úlohy alebo úlohy, objekt výnimky sa uloží do objektu Task. Naopak, ak máte asynchronnú metódu s návratovým typom neplatnosti, k úlohe nie je priradený žiadny objekt. Takéto výnimky sa vyvolávajú v SynchronizationContext, ktorý bol aktívny v čase, keď sa volala asynchrónna metóda. Inými slovami, nemôžete spracovať výnimky vyvolané v rámci metódy async void pomocou obslužných rutín výnimiek napísaných vo vnútri asynchrónnej metódy. Asynchronné metódy, ktoré majú návratový typ prázdnoty, sa tiež ťažko testujú kvôli tomuto rozdielu v sémantike spracovania chýb. Pre vašu informáciu predstavuje trieda SynchronizationContext v mennom priestore System.Threading synchronizačný kontext v .Net a pomôže vám zaradiť úlohu do iného kontextu.

Nasledujúci zoznam kódov to ilustruje. Máte dve metódy, konkrétne Test a TestAsync a druhá spôsobí výnimku.

verejná trieda AsyncDemo

   {

test verejnej neplatnosti ()

       {

skús

           {

TestAsync ();

           }

úlovok (výnimka okrem)

           {

Console.WriteLine (napr. Správa);

           }

       }

private async void TestAsync ()

       {

vyvolať novú výnimku („Toto je chybové hlásenie“);

       }

   }

Týmto spôsobom môžete vytvoriť inštanciu triedy AsyncDemo a vyvolať metódu Test.

static void Main (reťazec [] args)

       {

AsyncDemo obj = new AsyncDemo ();

obj.Test ();

Console.Read ();

       }

Testovacia metóda uskutoční volanie metódy TestAsync a volanie je zabalené vo vnútri bloku try-catch s úmyslom spracovať výnimku vyvolanú vo vnútri metódy TestAsync. Výnimka vyvolaná vo vnútri metódy TestAsync sa však nikdy nezachytí, t. J. Vo vnútri metódy volajúceho Test.

Vyhýbajte sa zmiešaniu asynchrónneho a synchrónneho kódu

Nikdy by ste nemali mať kombináciu synchrónneho a asynchrónneho kódu. Blokovať asynchrónny kód volaním na Task.Wait alebo Task.Result je zlý programovací postup. Odporučil by som použiť asynchrónny kód koniec-koniec - je to najbezpečnejší spôsob, ako sa vyhnúť chybám pri vkrádaní.

Zablokovaniu sa môžete vyhnúť použitím.ConfigureAwait (continueOnCapturedContext: false) kedykoľvek zavoláte, aby ste čakali. Ak toto nepoužívate, asynchronná metóda by sa zablokovala v mieste, kde sa volalo await. V takom prípade iba informujete čakateľa, aby nezachytával aktuálny kontext. Povedal by som, že je dobrým zvykom používať .ConfigureAwait (false), pokiaľ nemáte konkrétny dôvod nepoužívať ho.

Viac by som diskutoval o asynchrónnom programovaní v mojich budúcich blogových príspevkoch tu. Ďalšie informácie o osvedčených postupoch pri asynchrónnom programovaní nájdete v skvelom článku Stephena Clearyho na serveri MSDN.

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