Programování

Porozumění fondům vláken v C #

Vlákno je nejmenší jednotka provedení v rámci procesu. Fond vláken se skládá z několika vláken, nebo z přesněji kolekce vláken, a lze jej použít k provádění několika činností na pozadí.

Proč bych měl používat fondy vláken?

Vlákna jsou drahá, protože ve vašem systému spotřebovávají mnoho zdrojů pro inicializaci, přepínání kontextů a uvolňování prostředků, které zabírají. Normálně, když vlákno provádí vstupně-výstupní operaci (zpracování souborů, operace databáze nebo přístup k síťovým prostředkům atd.), Vlákno je operačním systémem blokováno, dokud není operace I / O dokončena. Vlákno obnoví svoji činnost CPU po dokončení své I / O operace.

Fond vláken je dobrou volbou, pokud chcete omezit počet vláken, která jsou spuštěna v daném okamžiku a chcete se vyhnout režii vytváření a ničení vláken ve vaší aplikaci. Je to také dobrá volba, když máte ve své aplikaci mnoho úkolů, které je třeba provést paralelně nebo souběžně a chcete zlepšit odezvu aplikace tím, že se vyhnete kontextovým přepínačům. Chcete-li vytvořit fond vláken, můžete využít třídu System.Threading.ThreadPool.

Následující fragment kódu ukazuje, jak můžete nastavit minimální počet vláken ve fondu vláken.

ThreadPool.SetMinThreads (50, 50);

Všimněte si však, že když je spuštěna dlouhotrvající úloha, může být vlákno fondu vláken blokováno po dlouhou dobu. Aby toho nebylo málo, příchozí požadavky, které závisí na vláknech z fondu vláken, mohou být pozastaveny nebo mohou být dokonce odmítnuty primárně, protože fond vláken nemusí mít k dispozici vlákna, která by mohla zpracovat příchozí požadavek. Fond vláken také není dobrá volba, pokud máte vlákna, která se liší svými prioritami, nebo možná budete muset vlákno předčasně přerušit. Předčasné ukončení podprocesu znamená, že podproces byl násilně zastaven před uplynutím doby jeho obratu.

Jak funguje fond vláken?

V podstatě při práci s fondy vláken byste obvykle vytvořili kolekci vláken a uložili je do fondu vláken před použitím vláken ve vaší aplikaci. Kdykoli budete potřebovat vlákno, měli byste je znovu používat, nikoli vytvářet nová vlákna pokaždé, když aplikace potřebuje použít vlákno.

Takže aplikace odešle požadavek do fondu podprocesů, aby z něj získal podproces, provedl činnosti pomocí podprocesu a po dokončení vrátil podproces zpět do podprocesu. Fondy vláken jsou užitečné v situacích, kdy máte k provedení více úkolů, než kolik můžete vytvořit (ve vaší aplikaci existuje omezení maximálního počtu vláken, která můžete na proces vytvořit).

Jak mohu optimalizovat fond vláken?

Při spuštění procesu je CLR přidělen fond vláken. Pokud potřebujete, můžete nakonfigurovat velikost fondu vláken. Modul runtime inteligentně spravuje fond vláken. Při spuštění fondu podprocesů je ve fondu podprocesů pouze jedno vlákno. Od té doby správce fondu vláken (komponenta odpovědná za správu fondu vláken) vytváří více vláken a ukládá je do fondu vláken, jak se zvyšuje zatížení aplikace, tj. Aplikace potřebuje provádět více a více úkolů souběžně.

Počet vláken, která mohou být v daném okamžiku k dispozici ve fondu vláken, se řídí maximálním povoleným limitem vláken ve fondu vláken. Jinými slovy, počet dostupných vláken ve fondu vláken se čas od času liší v závislosti na spotřebě vláken aplikací. Jakmile je dosaženo maximálního limitu (maximální počet vláken ve fondu vláken), aplikace vytvoří nová vlákna mnohem méně často.

V případě potřeby můžete vždy nastavit horní limit povolených vláken ve fondu vláken sami. Chcete-li to provést, měli byste využít vlastnost ThreadPool.SetMaxThreads. Chcete-li nastavit spodní limit vláken ve fondu vláken, můžete použít vlastnost ThreadPool.SetMinThreads. Výchozí dolní limit počtu vláken ve fondu vláken je jedno vlákno na procesor.