Programmēšana

Mani divi centi par pavedienu. Aborts un pavediens. Pārtrauktās metodes

C # gadījumā jums, iespējams, vajadzēs atbrīvot pavedienu, kas ir bloķēts. Lai to panāktu, varat izmantot divas metodes. Tie ietver Thread.Abort un Thread.Interrupt metodes.

Ko dara Thread.Abort metode?

Lai pārtrauktu pavedienu, varat izmantot klases Thread metodi Abort priekšrocības. Ņemiet vērā, ka, lai sāktu pavediena izbeigšanas procesu, atsaucoties uz grupas Thread metodi Abort, pavedienā, uz kuru tā ir izsaukta, tiek izvirzīta ThreadAbortException. Jāatzīmē, ka jūs varat izmantot Thread klases Abort metodi, lai pārtrauktu pat nebloķētu pavedienu. Ja pārtrauktais pavediens ir gaidīšanas stāvoklī, tas to pamodina un pēc tam tiek izmests ThreadInterruptedException. Līdzīgi, ja izsaucat Thread.Abort metodi pavedienam, kas atrodas gaidīšanas stāvoklī, izpildlaiks pamodina pavedienu un pēc tam izmet ThreadAbortException.

Jūs varat noķert ThreadAbortException noķeršanas blokā. Tomēr, ja jūs nezvanīsit uz ResetAbort metodi, šis izņēmums tiks atkārtoti izmests ķeršanas bloka beigās. Zvans uz ResetAbort metodi neļaus ThreadAbortException atkārtoti mest nozvejas bloka beigās. Pretēji tam, kā darbojas Thread.Inturrupt metodes, ja pavediens, uz kuru tiek dēvēta Thread.Abort metode, nav bloķēta, Thread.Abort metode uz pavedienu izmet ThreadAbortException.

Vairumā gadījumu (ja vien jūs nevēlaties izslēgt lietojumprogrammas domēnu pēc pavediena pārtraukšanas), šī metode nav jāizmanto vispār. Ņemiet vērā, ka ASP.Net metode Response.Redirect met ThreadAbortException.

Kāds ir Thread.Interrupt metodes mērķis?

Lai pārtrauktu pavedienu, kas atrodas stāvoklī WaitSleepJoin, varat izmantot Thread.Interrupt metodi. Tomēr neviena no šīm pieejām (Thread.Abort vai Thread.Interrupt metodes izsaukumi) nav droša. Kamēr Thread.Abort metode izmet ThreadAbortException, Thread.Interrupt metode met ThreadInterruptException. Būtībā zvans uz Thread.Interrupt metodi pārtrauc pavedienu un izmet ThreadInterruptedException, lai pārtrauktu pavedienu bloķējošā zvana iekšpusē. Šis izņēmums jārīkojas kodā, ja tas neizdodas, izpildlaiks apturētu pavedienu, uz kuru tika izsaukta Thread.Interrupt metode. Jāatzīmē, ka zvans uz Thread.Interrupt nepārtrauc pavedienu, kas izpilda nepārvaldītu kodu.

Apsveriet šo kodu sarakstu, kas parāda, kā Thread.Interrupt metodi var izsaukt piespiedu kārtā, lai pārtrauktu pavedienu.

static void Main (virkne [] args)

       {

Thread thread = new Thread (ThreadMethod);

pavediens.Sākt ();

pavediens.Pārtraukt ();

Konsole. Lasīt ();

       }

privāta statiska tukšums ThreadMethod ()

       {

mēģiniet

           {

Thread.Sleep (noildze. Bezgalīga);

           }

nozveja (ThreadInterruptedException)

           {

Console.Write ("ThreadInterruptedException ir izsaukts piespiedu kārtā.");

           }

       }

Kad iepriekš minētā programma ir izpildīta, konsolē tiks parādīts ziņojums "ThreadInterruptedException tika izsaukts piespiedu kārtā".

Kas notiek, ja pārtrauktais pavediens netiek bloķēts? Es zvanu uz Thread. Pārtraucot pavedienu, kas nav bloķēts, pavedienu turpinās izpildīt līdz brīdim, kad tas tiks bloķēts nākamreiz. Vairumā gadījumu jums nav jāizmanto Thread. Vispār pārtrauciet. To pašu varat sasniegt, izmantojot signalizācijas konstrukcijas vai atcelšanas žetonus.

Vai man vajadzētu izmantot Thread.Abort vai Thread.Interrupt metodi?

Tātad, kad man vajadzētu izmantot Thread.Abort vs Thread. Pārtraukt metodes manā programmā? Kuras no šīm metodēm man vajadzētu izmantot, ja man ir jāatceļ noteikta darbība? Mana godīga atbilde ir tāda, ka, lai pārtrauktu pavedienu, nekad nevajadzētu izmantot kādu no šīm metodēm. Ieteicams neizmantot Thread.Abort vai Thread.Pārtraukt metodes, lai pārtrauktu pavedienu - jums drīzāk jāizmanto sinhronizācijas objektu (piemēram, WaitHandles vai Semaforu) priekšrocības un jāizdara graciozi izmantoto pavedienu pārtraukšana. Šis koda fragments parāda, kā jūs varat izmantot WaitHandle priekšrocības, lai pavediens varētu graciozi apstāties.

private void ThreadMethod ()

{

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

   {

// Uzrakstiet savu kodu šeit

   }

}

Kā alternatīvu pieeju, lai pavedienu izbeigtu graciozi, varat izmantot arī gaistošā “būla” mainīgā priekšrocības. Pēc tam jūs varat iestatīt šo mainīgo lietotāja saskarnes pavedienā uz kādu lietotāja darbību (pieņemot, ka lietotājs ir noklikšķinājis uz lietotāja pogas "Atcelt", lai pārtrauktu pavedienu) un pēc tam darbiniekā laiku pa laikam pārbaudiet mainīgā vērtību pavedienu, lai redzētu, vai mainīgais ir iestatīts (varbūt vērtība "false", lai norādītu pavediena pārtraukšanu) lietotāja saskarnē.

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