Az állam meghatározása

880 II. Rész. C # könyvtár

Ha az Abort () módot null argumentummal hívjuk meg ebben a példaprogramban, akkor a ResetAbort () metódust hívó téma törli a megszakítási kérelmet. és ennek az áramlásnak a végrehajtása folytatódik. Az argumentum bármely más értéke megszakítja az áramlást.

A felfüggesztés és az áramlás folytatása

A .NET-keretrendszer korábbi verzióiban a szálat szüneteltetheti a Thread.Suspend () metódus meghívásával, és újraindíthatja a Thread módszer hívásával. Folytatás (). De most mindkét módszert elavultnak tekintik, és az új kódban nem ajánlott. Ennek az a magyarázata, különösen azokat, amelyek használata a Suspend () meto- ház valóban biztonságos, mert vele lehet felfüggeszteni a szál, amely jelenleg tart a zár, amely megakadályozza annak visszavonását, és ezért vezet a holtpont . Mindkét módszer használata komoly komplikációkat okozhat a rendszer szintjén. Ezért az egyéb szinkronizáló eszközöket, beleértve a mutexet és a szemaforát is, az áramlás szüneteltetéséhez és folytatásához kell használni.

A szál állapotát a Thread osztályban elérhető ThreadState tulajdonságból lehet beszerezni. Az alábbiakban ez a tulajdonság általános formája.

nyilvános ThreadState ThreadState

A szál állapotát a ThreadState felsorolásban megadott értékként adja vissza. Az alábbiakban felsoroljuk az ebben a listában meghatározott értékeket.

Mindezek az értékek nem igényelnek külön magyarázatot, kivéve az egyiket. A ThreadState.WaitSleepJoin értéke azt a állapotot jelzi, amelyre a szál a váró (), alvás () vagy a Join () metódusra vonatkozó várakozás során halad.

A fő szál alkalmazása

Amint azt a fejezet elején kifejtettük, minden C # programban van legalább egy végrehajtási téma, a fő téma. Ez a program automatikusan megkapja az áramlást, amint megkezdi a végrehajtást. A fonalat ugyanúgy lehet kezelni, mint az összes többi szálat.

A fő téma eléréséhez egy Thread objektumot kell megadnia, amely hivatkozik rá. Ezt a CurrentThread tulajdonság használatával végezzük el, amely a Thread osztály tagja. Az alábbiakban ez a tulajdonság általános formája.

nyilvános statikus Thread CurrentThread

23. fejezet Többsoros programozás. Első rész: Az alapok

Ez a tulajdonság hivatkozást ad arra a szálra, amelyben használják. Ezért ha a CurrentThread tulajdonságot a fő szál kódjának végrehajtásakor használjuk, használhatjuk azt a linket a fő streamhez. Ha ilyen link áll az Ön rendelkezésére, a fő szálat ugyanúgy kezelheti, mint bármelyik másik szálat.

// Mutassa be a fő szál kezelését.

class UseMain // Szerezd meg a fő szálat. Thrd = Thread.CurrentThread;

// Adja meg a fő szál nevét. ha (Thrd.Name == null)

Console.WriteLine ("A főcímnek nincs neve".); más

Console.WriteLine ("A fő téma neve:" + Thrd.Name);

// A fő menet elsőbbségének megjelenítése.

// Adja meg a nevet és a prioritást. Console.WriteLine ("A név és a prioritás beállítása \ n"); Thrd.Name = "Elsődleges adatfolyam";

Console.WriteLine ("Most a fő szál neve:" + Thrd.Name);

Console.WriteLine ("Most priority:" + Thrd.Priority);

Az alábbiakban ez a program eredménye.

A főcímnek nincs neve. Prioritás: Normál

Állítsa be a nevet és a prioritást.

Most a fő téma neve: Main Stream Now prioritás: AboveNormal

Ugyanakkor nagyon óvatosnak kell lennie, ha a műveleteket a fő streamrel végzi. Tehát ha a Main () metódus végén a következő hívást adja hozzá a Join () metódushoz:

a program soha nem fog véget érni, mert várni fogja a fő szál végét!

882 II. Rész. C # könyvtár

A .NET-keretrendszer 4.0-ban bevezetett többszálas többszálas eszközök

A .NET-keretrendszer 4.0-s verziójában számos új, többszálú eszközt vezetnek be, amelyek nagyon hasznosak lehetnek. A legfontosabb közülük egy új törlési rendszer. Ebben a rendszerben az áramlás megszüntetésére szolgáló mechanizmust egyszerű, jól definiált és strukturált módon támogatják. Ez a mechanizmus a megszüntetés fogalmán alapul, ami jelzi az áramlás törlésének állapotát. A törlési tüneteket a CancellationTokenSource osztály és a CancellationToken struktúra támogatja. A törlési rendszer teljesen integrálódik az új feladat párhuzamosító könyvtárba (TPL), ezért részletesebben tárgyaljuk a 24. fejezetben található TPL-vel együtt.

nyilvános statikus bool hozam ()

Ez a módszer egy true értéket ad vissza, ha a kontextus kapcsoló megtörténik. Ha egy másik szálat készen áll a végrehajtásra, akkor a környezetkapcsoló nem fog megtörténni.

Ajánlások a többszálas programozáshoz

Futtasson egy külön feladatot

A szálon alapuló többszöri feladat a leggyakrabban a C # programozással van megszervezve. Adott esetben a folyamatokon alapuló többfeladatú feladatok szervezhetők. Ebben az esetben ahelyett, hogy egy másik szálat futnának ugyanabban a programban

23. fejezet Többsoros programozás. Első rész: Alapok 883

egy program megkezdi a másik végrehajtását. A C # programozásakor ez a System névtérben definiált Process osztály használatával történik. Diagnostics. A fejezet végén röviden ismertetjük a másik folyamat indításának és kezelésének jellemzőit.

A legegyszerűbb módja egy másik folyamat elindításához a Start () módszer használata. a folyamatosztályban meghatározott. Az alábbiakban az egyik legegyszerűbb formája ennek a módszernek:

nyilvános statikus folyamatindítás (string fájlnév)

ahol a fájlnév egy adott fájlnevet jelöl, amelyet végre kell hajtani vagy társítani kell a végrehajtható fájlhoz.

nyilvános érvénytelen Bezár ()

A folyamatot kétféleképpen lehet megszakítani. Ha a folyamat egy grafikus felhasználói felületű Windows alkalmazás, akkor a CloseMainWindow () módszer a folyamat megszakítására szólít fel. amelynek formáját az alábbiakban adjuk meg.

nyilvános bool CloseMainWindow ()

Ezzel a módszerrel üzenetet küld a folyamathoz, amely azt utasítja, hogy leálljon. Boolean true értéket ad vissza, ha az üzenet érkezik, és egy boolean false, ha az alkalmazásnak nincs grafikus felhasználói felülete vagy főablaka. Azonban ne feledje, hogy a CloseMainWindow () metódus csak a folyamat leállítását kéri. Ha az alkalmazás figyelmen kívül hagy egy ilyen kérést, akkor nem szakad meg folyamatként.

A folyamat feltétel nélküli megszakításához hívja fel a Kill () módszert. az alábbiak szerint.

nyilvános érvénytelen Kill ()

A Kill () módszert azonban szépen kell használni, mivel a folyamat szabályozatlan megszakításához vezet. A megszakított folyamathoz kapcsolódó mentetlen adatok valószínűleg elvészek.

A folyamat várakozásainak megszervezéséhez használhatja a WaitForExit () metódust. Az alábbiakban két formája van.

nyilvános érvénytelen WaitForExit ()

nyilvános bool WaitForExit (int milliszekundum)

Az első formában a várakozás a folyamat befejezéséig folytatódik,

és a második formában - csak meghatározott számú milliszekundumra. Az utóbbi esetben a WaitForExit () metódus a Boolean true értéket ad vissza, ha a folyamat befejeződött, és a logikai érték hamis, ha még mindig fut.

884 II. Rész. C # könyvtár

// Mutasson be egy új folyamat elindítását.

class StartProcess Folyamat newProc = Process.Start ("wordpad.exe");

Console.WriteLine ("Az új folyamat fut.");

newProc.Close (); // engedje el a hozzárendelt erőforrásokat

Console.WriteLine ("Az új folyamat befejeződött.");

Amikor ez a program fut, elindul a szabványos WordPad alkalmazás, és az "Új folyamat indítása" üzenet jelenik meg a képernyőn. A program ezután vár a WordPad bezárására. Amikor a WordPad befejeződik, az "Az új folyamat befejeződött." Üzenet jelenik meg a képernyőn. .