Programavimas

Mano du centai už giją. Abortas ir gija. Pertraukiamieji metodai

C # kalbant dažnai gali tekti išleisti užblokuotą giją. Norėdami tai pasiekti, galite pasinaudoti dviem būdais. Tai apima giją. Abortas ir gija. Pertraukimo metodai.

Ką veikia „Thread.Abort“ metodas?

Norėdami nutraukti giją, galite pasinaudoti „Thread“ klasės „Abort“ metodu. Atkreipkite dėmesį, kad norint inicijuoti gijos nutraukimo procesą, iškreipus „Thread“ klasės metodą „Abort“, „ThreadAbortException“ iškyla gijoje, ant kurios jis buvo iškviestas. Reikėtų pažymėti, kad galite pasinaudoti „Thread“ klasės „Abort“ metodu ir nutraukti net neužblokuotą giją. Jei pertraukiama gija yra laukimo būsenoje, ji ją pažadina ir tada išmeta „ThreadInterruptedException“. Panašiai, jei iškviečiate „Thread.Abort“ metodą laukimo būsenoje esančioje gijoje, vykdymo laikas pažadina giją ir tada išmeta „ThreadAbortException“.

Galite sugauti „ThreadAbortException“ blokavimo bloke. Tačiau, jei nepaskambinsite metodo „ResetAbort“, ši išimtis bus permetama sugavimo bloko pabaigoje. Kvietimas naudoti „ResetAbort“ metodą neleis „ThreadAbortException“ pakartotinai mesti gaudymo bloko pabaigoje. Priešingai nei veikia „Thread.Inturrupt“ metodai, jei gija, ant kurios vadinamas „Thread.Abort“ metodas, nėra užblokuotas, „Thread.Abort“ metodas ant gijos užmeta „ThreadAbortException“.

Daugeliu atvejų (išskyrus atvejus, kai norite nutraukti programos domeną nutraukus giją), jums nereikia naudoti šio metodo. Atkreipkite dėmesį, kad ASP.Net metodas „Response.Redirect“ išmeta „ThreadAbortException“.

Koks yra „Thread.Interrupt“ metodas?

Norėdami pertraukti giją, esančią „WaitSleepJoin“ būsenoje, galite naudoti „Thread.Interrupt“ metodą. Tačiau nė vienas iš šių būdų („Thread.Abort“ arba „Thread.Interrupt“ metodo skambučiai) nėra saugūs siūlams. Kol metodas „Thread.Abort“ meta „ThreadAbortException“, metodas „Thread.Inbet“ išmeta „ThreadInterruptException“. Iš esmės skambutis į „Thread.Interrupt“ metodą nutraukia giją ir išmeta „ThreadInterruptedException“, kad pertrauktų giją blokuojančio skambučio viduje. Šią išimtį turėtumėte tvarkyti savo kode, jei nepavyktų, vykdymo laikas sustabdytų giją, kurioje buvo vadinamas „Thread.Interrupt“ metodas. Reikėtų pažymėti, kad skambutis į „Thread.Interrupt“ nenutraukia gijos, vykdančios nevaldomą kodą.

Apsvarstykite šį kodų sąrašą, kuris iliustruoja, kaip „Thread.Interrupt“ metodas gali būti priverstas priversti nutraukti giją.

static void Main (string [] args)

       {

Gijos gija = nauja gija (ThreadMethod);

siūlas.Pradėti ();

sriegis.Nutraukti ();

Pultas.Skaitykite ();

       }

privati ​​statinė negaliojanti „ThreadMethod“ ()

       {

bandyti

           {

Siūlas.Miegoti (skirtasis laikas).

           }

sugavimas (ThreadInterruptedException)

           {

Console.Write ("ThreadInterruptedException buvo iškviestas priverstinai.");

           }

       }

Vykdžius minėtą programą, konsolėje bus rodomas pranešimas „ThreadInterruptedException buvo priverstinai iškviestas“.

Kas atsitiks, jei pertraukiama gija nebus užblokuota? Aš skambinu į „Thread“. Nutraukite neužblokuotą giją, gija bus vykdoma tol, kol bus užblokuota. Daugeliu atvejų jums nereikia naudoti „Thread“. Visiškai pertraukite. Tą patį galite pasiekti naudodami signalizacijos konstrukcijas ar atšaukimo žetonus.

Ar turėčiau naudoti „Thread.Abort“ ar „Thread.Interrupt“ metodą?

Taigi, kada turėčiau naudoti „Thread.Abort vs Thread“. Pertraukia mano programos metodus? Kuriuos iš šių būdų turėčiau naudoti, jei reikia atšaukti tam tikrą operaciją? Nuoširdžiai atsakau, kad nutraukti giją niekada neturėtumėte naudoti nė vieno iš šių būdų. Patartina nenaudoti „Thread.Abort“ arba „Thread“. Nutraukite gijų nutraukimo metodus - verčiau pasinaudokite sinchronizavimo objektais (pvz., „WaitHandles“ ar „Semaforais“) ir atlikite grakščią naudojamų gijų nutraukimą. Šis kodo fragmentas parodo, kaip galite pasinaudoti „WaitHandle“ pranašumais, kad siūlas gražiai sustotų.

privatus negaliojantis „ThreadMethod“ ()

{

while (! manualResetEventObject.WaitOne (TimeSpan.FromMilliseconds (100)))

   {

// Čia parašykite savo kodą

   }

}

Kaip alternatyvų būdą nutraukti giją grakščiai, taip pat galite pasinaudoti nepastoviu „loginiu“ kintamuoju. Tada galite nustatyti šį kintamąjį vartotojo sąsajos gijoje tam tikroje vartotojo veikloje (tarkime, kad vartotojas spustelėjo vartotojo sąsajos mygtuką „Atšaukti“, norėdamas nutraukti giją) ir tada kartais tikrinkite kintamojo vertę „Worker“ temą, norėdami pamatyti, ar kintamasis nebuvo nustatytas (galbūt reikšmė „klaidinga“, kad būtų nurodyta gijos nutraukimas) vartotojo sąsajoje.

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