Programiranje

Moja dva centa na metodi Thread.Abort in Thread.Inutrupt

V C # boste morda pogosto morali sprostiti nit, ki je bila blokirana. Da bi to dosegli, lahko izkoristite dve metodi. Sem spadata metodi Thread.Abort in Thread.Interrupt.

Kaj počne metoda Thread.Abort?

Za prekinitev niti lahko izkoristite metodo Abort razreda Thread. Upoštevajte, da za začetek postopka zaključevanja niti metoda Abort razreda Thread ob priklicu dvigne ThreadAbortException v niti, v kateri je bila klicana. Upoštevati je treba, da lahko izkoristite metodo Abort razreda Thread, da zaključite celo neblokirano nit. Če je nit, ki je prekinjena, v stanju čakanja, jo zbudi in nato povzroči metanje ThreadInterruptedException. Podobno, če pokličete metodo Thread.Abort za nit, ki je v stanju čakanja, izvajalno okolje zbudi nit in nato vrže ThreadAbortException.

ThreadAbortException lahko ujamete v ulovnem bloku. Če pa ne pokličete metode ResetAbort, bo ta izjema znova vržena na konec bloka catch. Klic metode ResetAbort bo preprečil ponovno metanje ThreadAbortException na koncu bloka catch. V nasprotju s tem, kako delujejo metode Thread.Inturrupt, če nit, na kateri je poklicana metoda Thread.Abort, ni blokirana, metoda Thread.Abort vrže ThreadAbortException na nit.

V večini primerov (razen če želite zapreti domeno aplikacije po prekinitvi niti) te metode sploh ni treba uporabljati. Upoštevajte, da metoda Response.Redirect v ASP.Net vrže ThreadAbortException.

Kaj je namen metode Thread.Interrupt?

Z metodo Thread.Interrupt lahko prekinete nit, ki je v stanju WaitSleepJoin. Noben od teh pristopov (klici metode Thread.Abort ali Thread.Interrupt) ni varen za nit. Medtem ko metoda Thread.Abort vrže ThreadAbortException, metoda Thread.Interrupt vrže ThreadInterruptException. V bistvu klic metode Thread.Interrupt prekine nit in vrže ThreadInterruptException, da prekine nit znotraj blokirnega klica. S to izjemo bi morali ravnati v svoji kodi, v nasprotnem primeru bi izvajalno okolje ustavilo nit, na katero je bila klicana metoda Thread.Interrupt. Treba je opozoriti, da klic Thread.Interrupt ne prekine niti, ki izvaja neupravljano kodo.

Upoštevajte naslednji seznam kod, ki ponazarja, kako lahko prisilno prekinete metodo Thread.Interrupt za prekinitev niti.

statična praznina Main (string [] args)

       {

Nit niti = nova nit (metoda nit);

nit.Start ();

thread.Interrupt ();

Console.Read ();

       }

zasebna statična void ThreadMethod ()

       {

poskusite

           {

Thread.Sleep (Timeout.Infinite);

           }

catch (ThreadInterruptedException)

           {

Console.Write ("ThreadInterruptedException je bil prisilno poklican.");

           }

       }

Ko se zgornji program zažene, se v konzoli prikaže sporočilo »ThreadInterruptedException je bil prisilno poklican«.

Kaj se zgodi, če prekinjena nit ni blokirana? Če pokličete Thread. Prekinitev niti, ki ni blokirana, se bo še naprej izvajala do naslednjega blokiranja. V večini primerov Thread.Interrupt sploh ni treba uporabljati. Enako lahko dosežete z uporabo signalnih konstruktov ali žetonov za preklic.

Ali naj uporabim metodo Thread.Abort ali Thread.Interrupt?

Kdaj naj torej uporabim metode Thread.Abort vs Thread.Interrupt v svojem programu? Katero od teh metod moram uporabiti, če moram preklicati določeno operacijo? Moj iskren odgovor je, da nikoli ne smete uporabiti nobene od teh metod za prekinitev niti. Priporočljivo je, da za prekinitev niti ne uporabljate metod Thread.Abort ali Thread.Interrupt - raje izkoristite sinhronizacijske objekte (na primer WaitHandles ali Semaphores) in izvedite elegantno ukinitev niti, ki jo uporabljate. Naslednji delček kode prikazuje, kako lahko izkoristite WaitHandle, da omogočite, da se nit elegantno ustavi.

private void ThreadMethod ()

{

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

   {

// Tukaj napišite kodo

   }

}

Kot alternativni pristop za elegantno dokončanje niti lahko izkoristite tudi spremenljivo "logično" spremenljivko. Nato lahko to spremenljivko nastavite v niti uporabniškega vmesnika za neko uporabniško aktivnost (predpostavimo, da je uporabnik v uporabniškem vmesniku kliknil gumb »Prekliči«, da prekine nit) in nato občasno preverite vrednost spremenljivke v programu Worker nit, da vidite, ali je spremenljivka nastavljena (morda vrednost "false", ki označuje prekinitev niti) v uporabniškem vmesniku.

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