Najbolji primjeri u .Net asinkronom programiranju

Asinkrono programiranje omogućuje vam izvođenje I / O operacija koje zahtijevaju puno resursa, a da ne morate blokirati glavnu ili izvršnu nit aplikacije. Iako je koristan i naizgled jednostavan za provedbu, dolazi s puno složenosti i rizika. Potencijalni rizici povezani s asinkranim programiranjem, osobito pogrešnim korištenjem asinkronog programiranja nepoštivanjem preporučenih postupaka, uključuju mrtve točke, pad sustava i čak spori rad. Također biste trebali biti vješti u pisanju, uklanjanju pogrešaka asinkronog koda.

Izbjegavajte void tip povratka u async metodama

Metoda u C # napravljena je asinkronom metodom pomoću ključne riječi async u potpisu metode. Možete imati jednu ili više ključnih riječi čekati unutar async metode. Ključna riječ await koristi se za označavanje točke suspenzije. Async metoda u C # može imati bilo koju od ovih vrsta povrata: Task, Task i void. Ključna riječ "await" koristi se u asinhronoj metodi da bi se sastavljaču obavijestilo da metoda može imati točku suspenzije i nastavka.

Imajte na umu da je prilikom upotrebe TPL ekvivalent vraćanja praznine u TPL asinhroni zadatak. Trebali biste biti svjesni da async void jest i da se treba koristiti samo za async događaje. Ako ga upotrebljavate bilo gdje drugdje, naletjeli biste na pogreške. Drugim riječima, ne preporučuje se metoda asinkronizacije koja je poništila kao tip povrata. jer metode asinkronizacije koje vraćaju void imaju različitu semantiku kada radite s iznimkama u svojoj aplikaciji.

Kada se izuzetak dogodi u asinhronoj metodi koja ima povratni tip Zadatak ili Zadatak, objekt iznimke pohranjuje se unutar objekta Zadatak. Suprotno tome, ako imate async metodu s povratnom vrstom praznine, nije povezan objekt Task. Takve se iznimke podižu na SynchronizationContext koji je bio aktivan u vrijeme kada je pozvana asinkrona metoda. Drugim riječima, ne možete se nositi s iznimkama pokrenutim unutar async void metode pomoću rukovatelja iznimkama napisanih unutar asinkrone metode. Async metode koje imaju povratnu vrstu praznine također je teško testirati zbog ove razlike u semantici rukovanja pogreškama. Za vašu informaciju, klasa SynchronizationContext u prostoru imena System.Threading predstavlja kontekst sinkronizacije u .Netu i pomaže vam da zadatak stavite u drugi red.

Sljedeći popis kodova to ilustrira. Postoje dvije metode, naime, Test i TestAsync, a potonja donosi iznimku.

public class AsyncDemo

   {

       public void Test()

       {

           try

           {

               TestAsync();

           }

           catch (Exception ex)

           {

               Console.WriteLine(ex.Message);

           }

       }

       private async void TestAsync()

       {

           throw new Exception("This is an error message");

       }

   }

Evo kako možete stvoriti instancu klase AsyncDemo i pozvati metodu Test.

static void Main(string[] args)

       {

           AsyncDemo obj = new AsyncDemo();

           obj.Test();

           Console.Read();

       }

Metoda ispitivanja poziva metodu TestAsync i poziv je umotan u blok try-catch s namjerom obrade iznimke bačene unutar metode TestAsync. Međutim, izuzetak bačen unutar metode TestAsync nikada neće biti uhvaćen, tj. Obrađen unutar metode pozivatelja Test.

Izbjegavajte miješanje asinkronog i sinkronog koda

Nikada ne biste trebali imati kombinaciju sinkronog i asinkronog koda. Loša je programska praksa blokirati async kôd upućivanjem poziva Task.Wait ili Task.Result. Preporučio bih upotrebu async koda od kraja do kraja - to je najsigurniji način da se izbjegnu uvlačenja pogrešaka.

Pomoću možete izbjeći mrtve točke. ConfigureAwait(continueOnCapturedContext: false)kad god uputite poziv za čekanje. Ako ovo ne upotrebljavate, async metoda blokirat će se na mjestu gdje je pozvano await. U ovom slučaju samo obavještavate konobara da ne zahtijeva trenutni kontekst. Rekao bih da je dobra praksa koristiti .ConfigureAwait (lažno) osim ako nemate određeni razlog da ga ne koristite.

O mojim budućim postovima na blogu ovdje bih raspravljao više o asinkronom programiranju. Dodatne informacije o najboljim praksama u asinkronom programiranju potražite u sjajnom članku Stephena Clearyja na MSDN-u.