Programování

Jak pracovat s vlákny v C #

Vlákno je nejmenší jednotka provedení v rámci procesu. Vícevlákno je schopnost mít v daném čase více vláken v paměti a přepínat mezi nimi, aby zvládly více operací najednou. Microsoft .Net Framework poskytuje vynikající podporu pro práci s vlákny.

Programování vláken v C #

Chcete-li pracovat s vlákny, měli byste do své aplikace zahrnout obor názvů System.Threading. Chcete-li vytvořit nové vlákno, měli byste využít delegáta ThreadStart a předat odkaz na metodu, která by se měla ve vlákně spustit. Všimněte si, že delegát je ukazatel funkce bezpečný pro typ. Následující fragment kódu ukazuje, jak můžete pomocí tohoto delegáta vytvořit nový objekt vlákna.

 Thread t = new Thread (new ThreadStart (MyThreadMethod)); 

Chcete-li spustit nově vytvořené vlákno, měli byste zavolat metodu Start na objekt vlákna, který jste vytvořili. Následující příklad kódu to ilustruje. Všimněte si, že metoda vlákna MyThreadMethod se provádí na novém vlákně (nazývaném pracovní vlákno), které bylo vytvořeno.

 static void Main ()

        {

Thread t = new Thread (new ThreadStart (MyThreadMethod));

t.Start ();

Console.Read ();

        }

static void MyThreadMethod ()

        {

Console.WriteLine („Hello World!“);

        }

Zobrazit stavy vláken v C #

Vlákno v paměti může být v různých stavech - Aborted, Background, Running, Stopped, Suspended, Unstarted atd. Stavy vlákna jsou definovány ve výčtu ThreadState dostupném v oboru názvů System.Threading. Pokud není metoda Start volána na vlákně, vlákno je ve stavu Unstarted. Když je metoda Start vyvolána v instanci vlákna, změní se stav vlákna z Unstarted na Running.

Následující fragment kódu ukazuje, jak můžete zobrazit stav vlákna v konzole.

 Thread t = new Thread (new ThreadStart (MyThreadMethod));

t.Start ();

Console.WriteLine („Stav vlákna je:“ + t.ThreadState.ToString ());

Ovládejte vlákna popředí a pozadí v C #

Vlákna mohou běžet v popředí nebo na pozadí. Vlákna, která explicitně vytvoříte, jsou vlákna v popředí. Jedním z hlavních rozdílů mezi vláknem v popředí a vláknem na pozadí je, že vaše aplikace žije pouze tak dlouho, dokud běží jedno nebo více vláken v popředí. Vlákna v popředí v zásadě zabraňují ukončení aplikace. Naproti tomu vlákna na pozadí neudržují prostředí Common Language Runtime naživu.

Stav vlákna můžete nastavit pomocí vlastnosti IsBackground. Zde je příklad kódu, který ukazuje, jak toho lze dosáhnout.

 static void Main ()

        {

Thread t = new Thread (new ThreadStart (MyThreadMethod));

t.Start ();

t.IsBackground = true;

Console.WriteLine („Stav pozadí vlákna je:“ + t.IsBackground.ToString ());

Console.Read ();

        }

Vlákno můžete pozastavit nebo obnovit vyvoláním metod Suspend () a Resume () na objektu vlákna. Všimněte si, že vlákno, které jste dříve pozastavili, můžete obnovit pouze voláním metody Suspend ().

 Thread t = new Thread (new ThreadStart (MyThreadMethod));

t.Start ();

t.Suspend (); // Pozastaví nově vytvořené vlákno

t. Resume (); // Obnoví pozastavené vlákno

Je však třeba poznamenat, že metody Thread.Suspend () a Thread.Resume () byly zastaralé. Spíše byste měli použít metody AutoResetEvent a EventWaitHandle k synchronizaci aktivit zahrnujících vlákna.

Nastavit prioritu vlákna v C #

Můžete určit prioritu vlákna, abyste určili relativní podíl času procesoru, který vlákno získá ve srovnání s ostatními vlákny umístěnými v paměti. Priorita vlákna je definována ve výčtu ThreadPriority. Možné hodnoty zahrnují: Nejnižší, PodNormální, Normální, NadNormální a Nejvyšší. Následující fragment kódu ukazuje, jak můžete nastavit priority vláken dvou vláken pomocí Priority vlastnosti objektu vlákna.

 static void Main ()

        {

Thread thread1 = new Thread (new ThreadStart (Method1));

Thread thread2 = new Thread (new ThreadStart (Method2));

thread1.Priority = ThreadPriority.Highest;

thread2.Priority = ThreadPriority.Lowest;

thread2.Start ();

thread1.Start ();

Console.Read ();

        }

static void Method1 ()

        {

pro (int i = 0; i <10; i ++)

            {

Console.WriteLine („První vlákno:“ + i);

            }

        }

static void Metoda2 ()

        {

pro (int i = 0; i <10; i ++)

            {

Console.WriteLine („Druhé vlákno:“ + i);

            }

        }

Když spustíte výše uvedený fragment kódu, uvidíte, že první vlákno dokončí své provádění před druhým vláknem, přestože druhé vlákno bylo spuštěno před prvním vláknem v metodě Main.

Vlákna jsou drahá. Spotřebovávají ve vašem systému spoustu zdrojů pro inicializaci, přepínání kontextů a uvolňování prostředků, které spotřebovávají. Multithreading by proto měl být používán uvážlivě a pouze v případě potřeby. Když využijete výhody multithreadingu, je vždy vhodné využít fondy vláken k vytváření a správě vláken na vyžádání a ke zlepšení odezvy vaší aplikace.

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