Programmering

På Task.Factory.StartNew og Task.Run metoder

Når du opretter opgaver ved hjælp af Task.Factory.StartNew eller Task.Run-metoder, skal du huske visse vigtige punkter, når du skriver asynkron kode. I de fleste tilfælde anbefales det at undgå at bruge Task.Factory.StartNew-metoden, hvis du arbejder med asynkron kode. Hvis du arbejder med parallel kode, vil jeg sige, at StartNew er et godt valg.

En opgaveplanlægning er en komponent, der er ansvarlig for planlægning af opgaver; Net-rammen giver dig to opgaveplanlægninger. Der er standardopgaveplanlæggeren, der kører på .Net framework-trådpuljen, og der er opgaveplanlæggeren, der udføres på synkroniseringskonteksten for et bestemt mål. Standardopgaveplanlæggeren er tilstrækkelig det meste af tiden, men du kan også oprette din egen brugerdefinerede opgaveplanlægning for at give ekstra funktioner. For at oprette din egen tilpassede opgaveplanlægning skal du oprette en klasse, der udvider klassen System.Threading.Tasks.TaskScheduler.

Hvordan opretter jeg opgaver ved hjælp af Task Parallel Library?

Der er flere måder, hvorpå du kan oprette og starte opgaver i .Net. Du skal bruge System.Threading.Tasks.Task eller System.Threading.Tasks.Task-klasse for at oprette opgaver (en planlægbar enhed af arbejde). Mens førstnævnte bruges til at oprette en opgave, der ikke returnerer en værdi, bruges sidstnævnte til at oprette opgaver, der har returværdier. Egenskaben Task.Factory er en forekomst af klassen TaskFactory. Denne egenskab bruges til at oprette og planlægge opgaver. Mens metoden Task.Factory.StartNew fungerer som en gaffeloperation og bruges til at oprette og starte nye opgaver, fungerer Ventemetoden ligesom en sammenkædningsoperation og venter på, at opgaven er afsluttet.

Følgende kodestykke illustrerer, hvordan du kan bruge metoden Task.Factory.StartNew.

Task.Factory.StartNew (() => TestMethod (), CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);

Du kan også oprette en opgave ved hjælp af Task.Run-metoden som vist i kodestykket nedenfor.

offentlig async Opgave DoSomeWork ()

        {

afventer Task.Run (() => TestMethod ());

        }

ugyldig TestMethod ()

        {

Console.WriteLine ("Hej verden!");

        }

Hvis du vil returnere en værdi fra en opgave, kan du drage fordel af metoden Task.FromResult som vist i kodestykket nedenfor.

offentlig asynkronisk opgave DoSomeWork ()

   {

strengtekst = afventer Task.FromResult (GetMessage ());

   }

privat streng GetMessage ()

   {

returner "Hej verden!";

   }

Du kan også oprette opgaver ved hjælp af en delegeret eller en handling. Følgende kodestykke viser, hvordan du kan oprette opgaver ved hjælp af handlinger og delegerede.

Opgaveopgave1 = ny opgave (ny handling (skærm));

opgave1.Start ();

Opgave opgave2 = ny opgave (delegere {Display ();});

opgave2.Start ();

Du kan også oprette opgaver ved hjælp af lamba og anonyme metoder.

Task.Factory.StartNew og Task.Run

Task.Factory.StartNew er en hurtig måde at oprette og starte en opgave på. Bemærk, at et opkald til Task.Factory.StartNew svarer funktionelt til at oprette en opgaveforekomst og derefter kalde startmetoden på forekomsten. Det anbefales imidlertid ikke at blive brugt af rigelige årsager. Hvis du vil udføre synkron kode, er Task.Factory.StartNew ikke et godt valg.

Bemærk, at hvis en opgaveplanlægger er tilgængelig, vil StartNew-metoden udføre opgaven på den opgaveplanlægger. Tværtimod, hvis en planlægger ikke er tilgængelig, vil den udføre opgaven på en trådpulstråd. Det skal bemærkes, at Task.Factory.StartNew som standard er TaskScheduler.Current og ikke TaskScheduler.Default.

Bemærk, at et opkald til Task.Run (handling) svarer til følgende udsagn: Task.Factory.StartNew (handling, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

Tværtimod svarer et opkald til Task.Factory.StartNew (handling) til følgende udsagn:

Task.Factory.StartNew (handling, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Current);

Hvis du måske vil bruge Task.Factory.StartNew, hvis du har oprettet en brugerdefineret opgaveplanlægning og videregiver planlægningsinstansen eksplicit til den. Jeg vil altid anbefale at bruge Task.Run, da det er meget enklere og har sikrere standardindstillinger. Med andre ord bør vi undgå at bruge Task.Factory.StartNew, medmindre der er behov for at oprette en opgaveplanlægning og derefter videregive den eksplicit, når vi kalder StartNew-metoden for at oprette en ny opgave og planlægge den. Hvis du skulle bruge TaskFactory.StartNew-metoden effektivt og pålideligt, skal du bruge en brugerdefineret opgaveplanlægning og derefter angive CancellationToken og TaskCreationOptions.

Task.Run-metoden anbefales at bruge, når du ikke behøver at have meget finkornet kontrol over trådplanlægning og dens indviklinger. Du skal bruge Task.Run primært på CPU-bundne metoder. Du skal dog bruge Task.Run, mens du påkalder opgaven og ikke inden for gennemførelsen af ​​opgaven. Med andre ord skal du bruge Task.Run ikke inden for enhver implementering af en metode, men på det punkt, hvor metoden kaldes. Som et eksempel er følgende kodestykke et eksempel på et "dårligt" stykke kode.

offentlig async Opgave DownloadDataFromWebAsync (Uri uri)

        {

returnere afventer Task.Run (() =>

            {

ved hjælp af (WebClient webClient = ny WebClient ())

                {

returner webClient.DownloadString (uri);

                }

            });

        }

Se kodeuddraget ovenfor. Metoden er ikke skalerbar, da den blokerer baggrundstråden, henter en tråd fra trådpuljen og udfører synkront på den. Derfor vil det forbruge flere ressourcer i dit system.

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