Vícevláknové v C # S úkoly

programování termín „vlákno“ je zkratka pro vlákno provádění, ve kterém procesor sleduje zadanou cestu skrz váš kód. Koncept sledování více než jednoho vlákna současně představuje téma multi-tasking a multi-threading.

Aplikace obsahuje jeden nebo více procesů. Představte si proces jako program běžící na vašem počítači. Nyní má každý proces jedno nebo více vláken. Herní aplikace může mít vlákno pro načtení prostředků z disku, další pro AI a další pro spuštění hry jako serveru.

V prostředí .NET / Windows přiděluje operační systém vlákno procesoru. Každé vlákno sleduje obsluhy výjimek a prioritu, při které je spuštěno, a má někde, kam uložit vlákno, dokud se nespustí. Kontext vlákna je informace, kterou vlákno potřebuje obnovit.

Multi-Tasking With Threads

Vlákna zabírají trochu paměti a jejich vytváření zabere trochu času, takže obvykle jich mnoho nechcete používat. Pamatujte, že soutěží o čas procesoru. Pokud má váš počítač více procesorů, může systém Windows nebo .NET spustit každé vlákno na jiném procesoru, ale pokud několik vláken běží na stejném CPU, pak pouze jeden může být aktivní najednou a přepínání vláken trvá čas.

instagram viewer

CPU spouští vlákno pro několik miliónů instrukcí a poté přepne na jiné vlákno. Všechny registry CPU, aktuální bod provádění programu a zásobník musí být uloženy někde pro první vlákno a poté obnoveny od někde pro další vlákno.

Vytvoření vlákna

V oboru názvů. Vlákno, najdete typ vlákna. Závit konstruktoru (ThreadStart) vytvoří instanci podprocesu. Nicméně, v nedávné době C# kód, je pravděpodobnější, že předá lambda výraz, který volá metodu s libovolnými parametry.

Pokud si nejste jisti lambda výrazy, vyplatí se podívat na LINQ.

Zde je příklad vlákna, které je vytvořeno a spuštěno:

using System;
pomocí systému. Vlákna;
jmenný prostor ex1
{
program třídy
{
public static void Write1 ()
{
Řídicí panel. Zápis ('1');
Vlákno. Spánek (500);
}
static void Main (řetězec [] args)
{
var task = new Thread (Write1);
úkol. Start() ;
pro (var i = 0; i <10; i ++)
{
Řídicí panel. Zápis ('0');
Řídicí panel. Zápis (úkol. Je naživu? „A“: „D“);
Vlákno. Spánek (150);
}
Řídicí panel. ReadKey ();
}
}
}

Celý tento příklad je zapsat "1" do konzoly. Hlavní vlákno zapíše „0“ do konzoly 10krát, pokaždé následuje „A“ nebo „D“ v závislosti na tom, zda je druhé vlákno stále naživu nebo mrtvé.

Druhé vlákno běží pouze jednou a zapíše „1.“ Po půlsekundovém zpoždění podprocesu Write1 () se vlákno dokončí a úloha. IsAlive v hlavní smyčce nyní vrátí "D."

Paralelní knihovna podprocesů a úloh

Místo vytváření vlastního vlákna, pokud to opravdu nepotřebujete, využijte fond vláken. Z rozhraní .NET 4.0 máme přístup do knihovny paralelních úloh (TPL). Stejně jako v předchozím příkladu opět potřebujeme trochu LINQ a ano, jsou to všechny výrazy lambda.

Úkoly používají Thread Pool za scénami, ale lépe využívejte vlákna v závislosti na použitém počtu.

Hlavním objektem v TPL je Úkol. Toto je třída, která představuje asynchronní operaci. Nejběžnějším způsobem, jak začít věci běžet, je Úkol. Továrna. ZačítNový jako v:

Úkol. Továrna. StartNew (() => DoSomething ());

Kde DoSomething () je spuštěná metoda. Je možné vytvořit úlohu a nechat ji spustit okamžitě. V takovém případě použijte pouze Úkol jako je tento:

var t = new Task (() => Console). WriteLine ("Hello"));
...
t. Start();

To nespustí vlákno, dokud nezvolíte .Start (). V níže uvedeném příkladu je pět úkolů.

using System;
pomocí systému. Vlákna;
pomocí systému. Vlákno. Úkoly;
jmenný prostor ex1
{
program třídy
{
public static void Write1 (int i)
{
Řídicí panel. Zápis (i);
Vlákno. Spánek (50);
}
static void Main (řetězec [] args)
{
pro (var i = 0; i <5; i ++)
{
var hodnota = i;
var runningTask = Úkol. Továrna. StartNew (() => Write1 (value));
}
Řídicí panel. ReadKey ();
}
}
}

Spustit to a dostanete číslice 0 až 4 výstup v náhodném pořadí, jako je 03214. Je to proto, že pořadí provádění úkolů určuje .NET.

Možná vás zajímá, proč je potřeba hodnota var = i. Zkuste ji odstranit a zavolat Write (i), a uvidíte něco neočekávaného, ​​jako je 55555. Proč je to? Je to proto, že úloha zobrazuje hodnotu i v době, kdy je úloha prováděna, nikoli při vytvoření úlohy. Vytvořením nového proměnná pokaždé ve smyčce je každá z pěti hodnot správně uložena a vyzvednuta.