Programmering

Mine to cent på tråden. Afbrydelse og tråd. Afbrydelsesmetoder

I C # skal du muligvis ofte frigive en tråd, der er blevet blokeret. For at opnå dette er der to metoder, som du kan drage fordel af. Disse inkluderer metoderne Thread.Abort og Thread.Inrupt.

Hvad gør Thread.Abort-metoden?

For at afslutte en tråd kan du drage fordel af Abort-metoden i trådklassen. Bemærk, at for at starte processen med at afslutte en tråd, hæver Abort-metoden i trådklassen, når den påberåbes, en ThreadAbortException i den tråd, den er blevet kaldt til. Det skal bemærkes, at du kan drage fordel af afbrudsmetoden i trådklassen til at afslutte selv en ikke-blokeret tråd. Hvis tråden, der afbrydes, er i ventetilstand, vækker den den og får derefter en ThreadInterruptedException til at blive kastet. Tilsvarende, hvis du kalder metoden Thread.Abort på en tråd, der er i ventetilstand, vækker kørselstiden tråden op og kaster derefter en ThreadAbortException.

Du kan fange ThreadAbortException i fangstblokken. Men hvis du ikke kalder ResetAbort-metoden, kastes denne undtagelse igen i slutningen af ​​fangstblokken. Opkaldet til ResetAbort-metoden forhindrer, at ThreadAbortException genkastes i slutningen af ​​fangstblokken. I modsætning til hvordan Thread.Inturrupt-metoderne fungerer, hvis den tråd, som Thread.Abort-metoden kaldes til ikke er blokeret, kaster Thread.Abort-metoden en ThreadAbortException på tråden.

I de fleste tilfælde (medmindre du gerne vil lukke applikationsdomænet, når en tråd er afbrudt), behøver du slet ikke at bruge denne metode. Bemærk, at metoden Response.Redirect i ASP.Net kaster en ThreadAbortException.

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

Du kan bruge Thread.Interrupt-metoden til at afbryde en tråd, der er i WaitSleepJoin-tilstand. Ingen af ​​disse tilgange (Thread.Abort eller Thread.Inrupt Interrupt Method Call) er imidlertid trådsikre. Mens Thread.Abort-metoden kaster en ThreadAbortException, kaster Thread.Interrupt-metoden en ThreadInterruptException. I det væsentlige afbryder et opkald til Thread.Interrupt-metoden tråden og kaster en ThreadInterruptedException for at afbryde tråden inde i et blokerende opkald. Du bør håndtere denne undtagelse i din kode, der fejler, hvilket runtime stopper den tråd, som Thread.Interrupt-metoden er blevet kaldt til. Det skal bemærkes, at et opkald til Thread.Interrupt ikke afbryder en tråd, der udfører ikke-administreret kode.

Overvej følgende kodeliste, der illustrerer, hvordan Thread.Interrupt-metoden kan kaldes med magt for at afbryde en tråd.

statisk ugyldigt Main (streng [] args)

       {

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

tråd.Start ();

thread.Interrupt ();

Console.Read ();

       }

privat statisk ugyldigt ThreadMethod ()

       {

prøve

           {

Thread.Sleep (Timeout.Uendelig);

           }

fangst (ThreadInterruptedException)

           {

Console.Write ("ThreadInterruptedException er blevet kaldt med magt.");

           }

       }

Når ovenstående program udføres, vises meddelelsen "ThreadInterruptedException has been called forcely" i konsollen.

Hvad sker der, hvis tråden, der afbrydes, ikke blokeres? Hvis du foretager et opkald til tråden. Afbryd på en tråd, der ikke er blokeret, vil tråden fortsætte med at udføre indtil det tidspunkt, den er blokeret næste gang. I de fleste tilfælde behøver du slet ikke bruge Thread.Interrupt. Du kan opnå det samme ved hjælp af signalkonstruktioner eller annulleringstokener.

Skal jeg bruge metoden Thread.Abort eller Thread.Interrupt?

Så hvornår skal jeg bruge Thread.Abort vs Thread.Interrupt-metoder i mit program? Hvis jeg har brug for at annullere en bestemt handling, hvilken af ​​disse metoder skal jeg bruge? Mit ærlige svar er, at du aldrig skal bruge nogen af ​​disse metoder til at afslutte en tråd. Det tilrådes ikke at bruge Thread.Abort eller Thread.Interrupt-metoder til at afslutte en tråd - du bør hellere drage fordel af synkroniseringsobjekter (som WaitHandles eller Semaphores) og udføre en yndefuld afslutning af de tråde, du bruger. Følgende kodestykke illustrerer, hvordan du kan udnytte en WaitHandle for at lade en tråd stoppe yndefuldt.

privat ugyldig ThreadMethod ()

{

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

   {

// Skriv din kode her

   }

}

Som en alternativ tilgang til at afslutte en tråd yndefuldt, kan du også drage fordel af en flygtig "boolsk" variabel. Du kan derefter indstille denne variabel i brugergrænsefladen på en eller anden brugeraktivitet (antag at brugeren har klikket på knappen "Annuller" i brugergrænsefladen for at afslutte tråden) og derefter kontrollere værdien af ​​variablen fra tid til anden i arbejdstageren tråd for at se, om variablen er indstillet (måske værdien "falsk" for at indikere afslutning af tråden) i brugergrænsefladen.