Programování

V metodách Task.Factory.StartNew a Task.Run

Při vytváření úkolů pomocí metod Task.Factory.StartNew nebo Task.Run byste měli při psaní asynchronního kódu pamatovat na určité důležité body. Ve většině případů se doporučuje nepoužívat metodu Task.Factory.StartNew, pokud pracujete s asynchronním kódem. Pokud pracujete s paralelním kódem, řekl bych, že StartNew je dobrá volba.

Plánovač úloh je součást, která je zodpovědná za plánování úkolů; Rámec .Net vám poskytuje dva plánovače úkolů. Existuje výchozí plánovač úloh, který běží na fondu podprocesů .NET Framework, a existuje plánovač úloh, který se spouští v kontextu synchronizace zadaného cíle. Výchozí plánovač úloh bude většinu času stačit, ale můžete si také vytvořit svůj vlastní vlastní plánovač úloh, který vám poskytne další funkce. Chcete-li vytvořit svůj vlastní vlastní plánovač úloh, budete muset vytvořit třídu, která rozšiřuje třídu System.Threading.Tasks.TaskScheduler.

Jak vytvořím úkoly pomocí paralelní knihovny úkolů?

Existuje několik způsobů, jak můžete vytvářet a spouštět úkoly v .Net. K vytváření úkolů (rozvrhnutelná jednotka práce) musíte použít třídu System.Threading.Tasks.Task nebo System.Threading.Tasks.Task. Zatímco první se používá k vytvoření úlohy, která nevrací hodnotu, druhá se používá k vytvoření úkolů, které mají návratové hodnoty. Vlastnost Task.Factory je instancí třídy TaskFactory. Tato vlastnost se používá k vytváření a plánování úkolů. Zatímco metoda Task.Factory.StartNew funguje jako operace vidlice a slouží k vytváření a spouštění nových úkolů, metoda Wait funguje stejně jako operace spojení a čeká na dokončení úkolu.

Následující fragment kódu ukazuje, jak můžete použít Task.Factory.StartNew metodu.

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

Můžete také vytvořit úlohu pomocí metody Task.Run, jak je ukázáno v fragmentu kódu níže.

veřejná asynchronní úloha DoSomeWork ()

        {

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

        }

void TestMethod ()

        {

Console.WriteLine („Hello world!“);

        }

Pokud byste chtěli vrátit hodnotu z Task, můžete využít Task.FromResult metodu, jak je ukázáno v fragmentu kódu níže.

veřejná asynchronní úloha DoSomeWork ()

   {

string text = await Task.FromResult (GetMessage ());

   }

soukromý řetězec GetMessage ()

   {

návrat "Hello world!";

   }

Úkoly můžete také vytvořit pomocí delegáta nebo akce. Následující fragment kódu ukazuje, jak můžete vytvářet úkoly pomocí akcí a delegátů.

Úkol task1 = nový úkol (nová akce (displej));

task1.Start ();

Úkol task2 = nový úkol (delegát {Display ();});

task2.Start ();

Úkoly můžete také vytvářet pomocí lamba a anonymních metod.

Task.Factory.StartNew a Task.Run

Task.Factory.StartNew je rychlý způsob vytváření a spouštění úlohy. Všimněte si, že volání Task.Factory.StartNew je funkčně ekvivalentní vytvoření instance úlohy a následnému volání metody Start na instanci. Nedoporučuje se však používat z mnoha důvodů. Pokud byste chtěli spustit synchronní kód, Task.Factory.StartNew není dobrá volba.

Všimněte si, že pokud je k dispozici plánovač úloh, metoda StartNew provede úlohu na tomto plánovači úloh. Naopak, pokud není k dispozici plánovač, provedl by úlohu na vlákně fondu vláken. Je třeba poznamenat, že Task.Factory.StartNew je výchozí pro TaskScheduler.Current a ne TaskScheduler.Default.

Všimněte si, že volání Task.Run (action) je ekvivalentní následujícímu prohlášení: Task.Factory.StartNew (action, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

Naopak, volání Task.Factory.StartNew (action) je ekvivalentní následujícímu prohlášení:

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

Pokud možná budete chtít použít Task.Factory.StartNew, pokud jste vytvořili vlastní plánovač úloh a explicitně mu předáte instanci plánovače. Vždy bych doporučil použít Task.Run, protože je mnohem jednodušší a má bezpečnější výchozí hodnoty. Jinými slovy bychom se měli vyhnout používání Task.Factory.StartNew, pokud není potřeba vytvořit plánovač úloh a poté jej explicitně předat při volání metody StartNew k vytvoření nového úkolu a jeho naplánování. Pokud byste měli efektivně a spolehlivě použít metodu TaskFactory.StartNew, měli byste použít vlastní plánovač úloh a poté určit CancellationToken a TaskCreationOptions.

Metodu Task.Run se doporučuje použít, když nepotřebujete mít mnohem jemnější kontrolu nad plánováním vláken a jeho složitostmi. Task.Run byste měli používat primárně na metody vázané na CPU. Měli byste však použít Task.Run při vyvolání úkolu a ne uvnitř implementace úkolu. Jinými slovy byste měli použít Task.Run ne uvnitř žádné implementace metody, ale v místě, kde se metoda volá. Následující fragment kódu je například příkladem „špatného“ kódu.

veřejná asynchronní úloha DownloadDataFromWebAsync (Uri uri)

        {

návrat čekají na Task.Run (() =>

            {

pomocí (WebClient webClient = nový WebClient ())

                {

vrátit webClient.DownloadString (uri);

                }

            });

        }

Viz výše uvedený fragment kódu. Metoda není škálovatelná, protože by blokovala vlákno na pozadí, načítala vlákno z fondu vláken a synchronně se na něm spouštěla. Proto by ve vašem systému spotřebovalo více zdrojů.

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