Threads vernietigen
Als u de uitvoering van de thread wilt beëindigen, gebruikt u meestal het samenwerkingsannuleringsmodel. Soms is het echter niet mogelijk om een thread gezamenlijk te stoppen, omdat er code van derden wordt uitgevoerd die niet is ontworpen voor coöperatief annuleren. In .NET Framework-apps kunt u de Thread.Abort methode gebruiken om een beheerde thread geforceerd te beëindigen. Wanneer u aanroept Abort, genereert Common Language Runtime een ThreadAbortException in de doelthread, die de doelthread kan vangen. (De .NET Framework-runtime voert de uitzondering na het catch
blok echter altijd automatisch opnieuw in.) Zie voor meer informatie Thread.Abort.
De Thread.Abort methode wordt niet ondersteund in .NET 5 (inclusief .NET Core) en latere versies. Als u de uitvoering van code van derden geforceerd wilt beëindigen in .NET 5+, voert u deze uit in het afzonderlijke proces en gebruikt Process.Killu deze.
Notitie
- Wanneer u een andere thread dan de huidige thread aanroept Thread.Abort , weet u niet welke code is uitgevoerd of niet kan worden uitgevoerd wanneer de ThreadAbortException thread wordt gegenereerd. U kunt ook niet zeker zijn van de status van uw toepassing of een toepassing en gebruikersstatus dat deze verantwoordelijk is voor het behoud. Aanroepen Thread.Abort kunnen bijvoorbeeld voorkomen dat statische constructors of de release van beheerde of onbeheerde resources worden uitgevoerd.
- Als een thread niet-beheerde code uitvoert wanneer de Abort methode wordt aangeroepen, wordt deze ThreadState.AbortRequesteddoor de runtime gemarkeerd. De uitzondering wordt gegenereerd wanneer de thread terugkeert naar beheerde code.
Zodra een thread is afgebroken, kan deze niet opnieuw worden gestart.
De Abort methode zorgt er niet voor dat de thread onmiddellijk wordt afgebroken, omdat de doelthread willekeurige ThreadAbortException hoeveelheden code in een finally
blok kan vangen en uitvoeren. U kunt bellen Thread.Join als u moet wachten totdat de thread is beëindigd. Thread.Join is een blokkerende aanroep die pas wordt geretourneerd als de thread daadwerkelijk is gestopt of een optioneel time-outinterval is verstreken. De afgebroken thread kan de ResetAbort methode aanroepen of niet-gebonden verwerking uitvoeren in een finally
blok, dus als u geen time-out opgeeft, wordt de wachttijd niet gegarandeerd beëindigd.
Threads die wachten op een aanroep naar de Thread.Join methode, kunnen worden onderbroken door andere threads die worden aangeroepen Thread.Interrupt.
ThreadAbortException verwerken
Als u verwacht dat uw thread wordt afgebroken, hetzij als gevolg van het aanroepen Abort vanuit uw eigen code of als gevolg van het verwijderen van een toepassingsdomein waarin de thread wordt uitgevoerd (AppDomain.Unload wordt gebruikt Thread.Abort om threads te beëindigen), moet uw thread de ThreadAbortException laatste verwerking in een finally
component verwerken en uitvoeren, zoals wordt weergegeven in de volgende code.
Try
' Code that is executing when the thread is aborted.
Catch ex As ThreadAbortException
' Clean-up code can go here.
' If there is no Finally clause, ThreadAbortException is
' re-thrown by the system at the end of the Catch clause.
Finally
' Clean-up code can go here.
End Try
' Do not put clean-up code here, because the exception
' is rethrown at the end of the Finally clause.
try
{
// Code that is executing when the thread is aborted.
}
catch (ThreadAbortException ex)
{
// Clean-up code can go here.
// If there is no Finally clause, ThreadAbortException is
// re-thrown by the system at the end of the Catch clause.
}
// Do not put clean-up code here, because the exception
// is rethrown at the end of the Finally clause.
Uw opschoningscode moet zich in de catch
component of de finally
component bevinden, omdat het ThreadAbortException systeem aan het einde van de finally
component of aan het einde van de catch
component wordt omgeworpen als er geen finally
component is.
U kunt voorkomen dat het systeem de uitzondering opnieuw beperkt door de methode aan te Thread.ResetAbort roepen. U moet dit echter alleen doen als uw eigen code de ThreadAbortExceptionoorzaak is.