Programmering

Mine to øre på tråden. Abort og tråd. Avbruddsmetoder

I C # må du ofte slippe en tråd som er blokkert. For å oppnå dette er det to metoder du kan dra nytte av. Disse inkluderer metodene Thread.Abort og Thread.Interrupt.

Hva gjør Thread.Abort-metoden?

For å avslutte en tråd kan du dra nytte av avbryt-metoden i trådklassen. Merk at for å starte prosessen med å avslutte en tråd, avbryter metoden i trådklassen når den påkalles, en ThreadAbortException i tråden den er blitt kalt til. Det skal bemerkes at du kan dra nytte av Avbryt-metoden i trådklassen for å avslutte til og med en ikke-blokkert tråd. Hvis tråden som blir avbrutt er i ventetilstand, vekker den den og fører til at en ThreadInterruptedException blir kastet. På samme måte, hvis du kaller Thread.Abort-metoden på en tråd som er i ventetilstand, vekker kjøretiden tråden og kaster deretter en ThreadAbortException.

Du kan fange ThreadAbortException i fangstblokken. Imidlertid, hvis du ikke kaller ResetAbort-metoden, vil dette unntaket bli kastet på nytt på slutten av fangstblokken. Anropet til ResetAbort-metoden vil forhindre at ThreadAbortException blir kastet på nytt på slutten av fangstblokken. I motsetning til hvordan tråden.Inturrupt-metodene fungerer, hvis tråden som tråden.Abort-metoden kalles for ikke er blokkert, kaster tråden.Abort-metoden en trådAborteksepsjon på tråden.

I de fleste tilfeller (med mindre du vil stenge applikasjonsdomenet etter at en tråd er avbrutt), trenger du ikke å bruke denne metoden i det hele tatt. Merk at Response.Redirect-metoden i ASP.Net kaster en ThreadAbortException.

Hva er formålet med Thread.Interrupt-metoden?

Du kan bruke metoden Thread.Interrupt til å avbryte en tråd som er i WaitSleepJoin-tilstand. Imidlertid er ingen av disse tilnærmingene (Thread.Abort eller Thread.Interrupt method calls) trådsikre. Mens Thread.Abort-metoden kaster en ThreadAbortException, kaster Thread.Interrupt-metoden en ThreadInterruptException. I hovedsak avbryter en samtale til Thread.Interrupt-metoden tråden og kaster en ThreadInterruptedException for å avbryte tråden inne i en blokkerende samtale. Du bør håndtere dette unntaket i koden din som ikke klarer at kjøretiden stopper tråden som Thread.Interrupt-metoden har blitt kalt til. Det skal bemerkes at en samtale til Thread.Interrupt ikke avbryter en tråd som utfører ukontrollert kode.

Vurder følgende kodeliste som illustrerer hvordan Thread.Interrupt-metoden kan kalles med makt for å avbryte en tråd.

statisk tomrom Main (streng [] args)

       {

Trådtråd = ny tråd (trådmetode);

tråd.Start ();

thread.Interrupt ();

Console.Read ();

       }

privat statisk tomrom ThreadMethod ()

       {

prøve

           {

Thread.Sleep (Timeout.Infinite);

           }

fangst (ThreadInterruptedException)

           {

Console.Write ("ThreadInterruptedException har blitt kalt med tvang.");

           }

       }

Når programmet ovenfor kjøres, vises meldingen "ThreadInterruptedException has been called forcely" i konsollen.

Hva skjer hvis tråden som blir avbrutt ikke blir blokkert? Hvis du ringer til tråden. Avbryt tråden som ikke er blokkert, tråden vil fortsette å kjøre til den tiden den blokkeres neste gang. I de fleste tilfeller trenger du ikke bruke Thread.Interrupt i det hele tatt. Du kan oppnå det samme ved hjelp av signalkonstruksjoner eller avbestillingstokener.

Bør jeg bruke metoden Thread.Abort eller Thread.Interrupt?

Så når skal jeg bruke Thread.Abort vs Thread.Interrupt metoder i programmet mitt? Hvis jeg trenger å avbryte en bestemt operasjon, hvilken av disse metodene skal jeg bruke? Mitt ærlige svar er at du aldri skal bruke noen av disse metodene for å avslutte en tråd. Det anbefales at du ikke bruker Thread.Abort eller Thread.Interrupt metoder for å avslutte en tråd - du bør heller dra nytte av synkroniseringsobjekter (som WaitHandles eller Semaphores) og utføre en grasiøs avslutning av trådene du bruker. Følgende kodebit illustrerer hvordan du kan dra nytte av en WaitHandle for å la en tråd stoppe grasiøst.

privat ugyldig ThreadMethod ()

{

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

   {

// Skriv koden din her

   }

}

Som en alternativ tilnærming for å avslutte en tråd elegant, kan du også dra nytte av en flyktig "boolsk" variabel. Du kan deretter sette denne variabelen i UI-tråden på en eller annen brukeraktivitet (antar at brukeren har klikket på "Avbryt" -knappen i brukergrensesnittet for å avslutte tråden) og deretter sjekke verdien på variabelen fra tid til annen i Arbeideren tråd for å se om variabelen er satt (kanskje verdien "false" for å indikere avslutning av tråden) i brukergrensesnittet.

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