Programavimas

„Task.Factory.StartNew“ ir „Task.Run“ metodai

Kurdami užduotis naudodami „Task.Factory.StartNew“ arba „Task.Run“ metodus, turėtumėte nepamiršti tam tikrų svarbių dalykų rašydami asinchroninį kodą. Daugeliu atvejų patartina vengti Task.Factory.StartNew metodo, jei dirbate su asinchroniniu kodu. Jei dirbate su lygiagrečiu kodu, sakyčiau, kad „StartNew“ yra geras pasirinkimas.

Užduočių planuoklis yra komponentas, atsakingas už užduočių planavimą; .Net sistema suteikia jums du užduočių planuoklius. Yra numatytasis užduočių planuoklis, kuris veikia .Net pagrindo gijų telkinyje, ir užduočių planuoklis, vykdomas nurodyto tikslo sinchronizavimo kontekste. Numatytojo užduočių planavimo priemonės pakaks dažniausiai, tačiau taip pat galite sukurti savo pasirinktinį užduočių planavimo priemonę, kad galėtumėte suteikti papildomų funkcijų. Norėdami sukurti savo pasirinktinį užduočių planuoklį, turėsite sukurti klasę, pratęsiančią „System.Threading.Tasks.TaskScheduler“ klasę.

Kaip sukurti užduotis naudojant „Task Parallel Library“?

Yra keli būdai, kuriais galite kurti ir paleisti užduotis .NET. Norėdami sukurti užduotis (planuojamas darbo vienetas), turite naudoti „System.Threading.Tasks.Task“ arba „System.Threading.Tasks.Task“ klasę. Pirmasis naudojamas kuriant užduotį, kuri negrąžina vertės, antroji naudojama kuriant užduotis, turinčias grąžinimo vertes. Nuosavybė „Task.Factory“ yra „TaskFactory“ klasės egzempliorius. Ši ypatybė naudojama kuriant ir planuojant užduotis. Nors „Task.Factory.StartNew“ metodas veikia kaip šakės operacija ir yra naudojamas kuriant ir pradedant naujas užduotis, „Wait“ metodas veikia taip pat kaip sujungimo operacija ir laukia, kol užduotis bus baigta.

Šis kodo fragmentas parodo, kaip galite naudoti metodą „Task.Factory.StartNew“.

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

Taip pat galite sukurti užduotį naudodami metodą „Task.Run“, kaip parodyta žemiau esančiame kodo fragmente.

viešoji asinchroninė užduotis „DoSomeWork“ ()

        {

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

        }

negaliojantis „TestMethod“ ()

        {

Console.WriteLine („Labas pasaulis!“);

        }

Jei norite grąžinti vertę iš užduoties, galite pasinaudoti metodu „Task.FromResult“, kaip parodyta žemiau esančiame kodo fragmente.

viešoji asinchroninė užduotis „DoSomeWork“ ()

   {

eilutės tekstas = laukti Task.FromResult (GetMessage ());

   }

privati ​​eilutė „GetMessage“ ()

   {

grįžti „Sveikas pasaulis!“;

   }

Taip pat galite kurti užduotis naudodami delegatą ar veiksmą. Šis kodo fragmentas parodo, kaip galite sukurti užduotis naudodami veiksmus ir delegatus.

Užduoties užduotis1 = nauja užduotis (naujas veiksmas (ekranas));

užduotis1.Pradėti ();

Užduoties užduotis2 = nauja užduotis (deleguoti {Display ();});

task2.Pradėti ();

Taip pat galite kurti užduotis naudodami „lamba“ ir anoniminius metodus.

„Task.Factory.StartNew“ ir „Task.Run“

„Task.Factory.StartNew“ yra greitas būdas sukurti ir paleisti užduotį. Atkreipkite dėmesį, kad iškvietimas į Task.Factory.StartNew funkciniu požiūriu yra lygiavertis užduoties egzemplioriaus sukūrimui ir tada metodo Pradėti iškvietimui egzemplioriuje. Tačiau nerekomenduojama vartoti dėl daugybės priežasčių. Jei norite paleisti sinchroninį kodą, „Task.Factory.StartNew“ nėra geras pasirinkimas.

Atminkite, kad jei yra užduočių planavimo priemonė, metodas „StartNew“ vykdys užduotį tame užduočių planuoklyje. Priešingai, jei tvarkaraščio nėra, jis vykdys užduotį gijų baseino gijoje. Reikėtų pažymėti, kad „Task.Factory.StartNew“ pagal numatytuosius nustatymus yra „TaskScheduler.Current“, o ne „TaskScheduler.Default“.

Atkreipkite dėmesį, kad iškvietimas į Task.Run (veiksmas) yra lygiavertis šiam teiginiui: Task.Factory.StartNew (veiksmas, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

Priešingai, iškvietimas į Task.Factory.StartNew (veiksmas) yra lygiavertis šiam teiginiui:

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

Jei norite naudoti „Task.Factory.StartNew“, jei sukūrėte pasirinktinį užduočių planavimo įrankį ir aiškiai jam perdavėte tvarkaraščio egzempliorių. Aš visada rekomenduočiau naudoti „Task.Run“, nes jis yra daug paprastesnis ir turi saugesnius numatytuosius nustatymus. Kitaip tariant, turėtume vengti naudoti „Task.Factory.StartNew“, nebent reikia sukurti užduočių planavimo priemonę ir tada ją aiškiai perduoti, kai iškviečiate „StartNew“ metodą, kad sukurtumėte naują užduotį ir ją suplanuotumėte. Jei naudojote „TaskFactory.StartNew“ metodą efektyviai ir patikimai, turėtumėte naudoti pasirinktinį užduočių planavimo įrankį, tada nurodyti „CancellationToken“ ir „TaskCreationOptions“.

Metodą „Task.Run“ rekomenduojama naudoti, kai jums nereikia labai tiksliai kontroliuoti siūlų planavimo ir jo subtilybių. Turėtumėte naudoti „Task.Run“ pirmiausia taikydami susietus su procesoriumi metodus. Tačiau turėtumėte naudoti „Task.Run“ iškviesdami užduotį, o ne vykdydami užduotį. Kitaip tariant, turėtumėte naudoti užduotį. Vykdykite ne bet kuriame metodo įgyvendinime, bet toje vietoje, kur metodas vadinamas. Toliau pateiktas kodo fragmentas yra „blogo“ kodo pavyzdys.

viešasis asinchroninis uždavinys DownloadDataFromWebAsync (Uri uri)

        {

grįžimas laukia Užduotis. Vykdyti (() =>

            {

naudojant („WebClient webClient = new WebClient ()“)

                {

grąžinti „webClient.DownloadString“ (uri);

                }

            });

        }

Žr. Aukščiau pateiktą kodo fragmentą. Metodas nėra keičiamas, nes jis užblokuotų fono giją, gautų giją iš gijų telkinio ir sinchroniškai ją vykdytų. Taigi tai sunaudotų daugiau išteklių jūsų sistemoje.

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