Programmering

Lær synkronisering Kontekst, asynkronisering og vent

Asynkron programmering er en form for parallell programmering som gjør det mulig å utføre oppgaver som er atskilt fra hovedprogramtråden, og deretter varsle tråden når kjøringen er over. Asynkroni hjelper deg med å utføre oppgaver uten behov for å holde på kjøringsflyten eller responsen til applikasjonen din.

Microsoft har gitt støtte for parallell programmering i .Net Framework for å utnytte fordelene med flerkjernesystemer. Du kan utnytte asynkroni for å forbedre ytelsen og responsen til applikasjonen din.

I hovedsak er det to mulige typer operasjoner i en applikasjon. Disse inkluderer beregningsbundet og I / O-bundet operasjon. Beregningsbundne operasjoner er de der beregningen kan utføres på en egen tråd slik at hovedtråden kan fortsette med utførelsen. Tvert imot, I / O-bundne operasjoner er de som blir utført eksternt, og derfor trenger de ikke å blokkere den gjeldende tråden mens I / O pågår.

Synkroniseringskontekst og utførelseskontekst

Hver tråd har en sammenheng knyttet til seg - dette er også kjent som den "nåværende" konteksten - og disse sammenhengene kan deles på tvers av tråder. ExecutionContext inneholder relevante metadata for det aktuelle miljøet eller konteksten der programmet er i utførelse. SynchronizationContext representerer en abstraksjon - den angir stedet der applikasjonens kode kjøres.

En SynchronizationContext lar deg sette en oppgave i kø i en annen kontekst. Merk at hver tråd kan ha sin egen SynchronizatonContext. SynchronizationContext-klassen er nylig lagt til i System.Trading navneområdet og letter kommunikasjon mellom tråder. Du kan lese mer om SynchronizationContext og ExecutionContext her.

Et dypdykk inne i Async og Await

De tre asynkrone programmeringsmønstrene inkluderer følgende:

  1. Asynkron programmeringsmodell (APM)
  2. Hendelsesbasert asynkront mønster (EAP)
  3. Oppgavebasert asynkront mønster (TAP)

Den siste, anbefalte og også den mest elegante av disse er TAP.

Merk at du kan markere en metode ved å bruke søkeordet "async" som returnerer ugyldig, Oppgave eller Oppgave. Vær oppmerksom på at når et unntak forekommer i en asynkron metode som har en returtype Oppgave eller Oppgave, blir unntaksdetaljene lagret i Oppgaveforekomsten.

Tvert imot, når et unntak forekommer i en asynkron metode som har en returform av tomrom, lagres unntaksdetaljene i SynchronizationContext som var aktiv på det tidspunktet da den asynkrone metoden ble kalt. I hovedsak kan du ikke håndtere unntak hevet innenfor en asynkron metode som har en returform av tomrom ved hjelp av unntakshåndterere skrevet i den asynkrone metoden. På grunn av de forskjellige databehandlings- og feilhåndteringssemantikkene, anbefales det å unngå asynkrone metoder som har ugyldige returtyper med mindre det er tilstrekkelig grunn til å bruke dem.

Når du bruker nøkkelordet "venter" i en asynkron metode, blir metoden delt opp i en tilstandsmaskin. Vær oppmerksom på at nøkkelordet "avvente" fanger den nåværende SynchronizationContext, og så snart oppgaven som har blitt ventet med "nøkkelordet" er fullført, gjenopptas tilstandsmaskinen og kjøringen av koden i innringermetoden starter på nytt - dette er også kjent som fortsettelse. Hvis utførelse av koden som har blitt ventet ved å bruke nøkkelordet "avvente" er fullført på det tidspunktet suspensjonspunktet oppstår, kjøres den asynkrone metoden (metoden som er merket som "asynkronisert") synkront. Hvis utførelsen av koden som er ventet ikke er fullført, er en fortsettelsesdelegat knyttet til koden som har blitt avventet.

Du kan dra nytte av asynkrone metoder som returnerer ugyldige for å lage asynkrone hendelsesbehandlere. Hovedmetoden kan ikke merkes med nøkkelordet "async", da det er programmets inngangspunkt. En "async" -hovedmetode vil avslutte øyeblikket det kalles. Nøkkelordet "venter" informerer kompilatoren om at metoden kan ha et suspensjons- og gjenopptakspunkt. Forresten kan du bare bruke nøkkelordet "vent" på en metode som er merket som asynkron ved å bruke nøkkelordet "asynkronisering".

En asynkroniseringsmetode når den kalles, kjører synkront på gjeldende tråd, uavhengig av returtypen til metoden. Når du markerer en metode som asynkron ved å bruke nøkkelordet "async", informerer du bare kompilatoren om at metoden kan deles i flere oppgaver - noen av disse oppgavene kan utføres asynkront. Inkluderingen av nøkkelordet "async" i en metode står ikke i kø for metodeanropet som en del av trådrammen. Asynkronien (dvs. om en metode vil ha asynkron oppførsel) avhenger faktisk av suspensjonspunktet du har nevnt i metoden din ved å bruke nøkkelordet "venter". Hvis du ikke inkluderer "vent" -nøkkelordet i en asynkron metode, vil hele metoden kjøres synkront.

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