Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 Abort aanroept, gooit de Common Language Runtime een ThreadAbortException in de doelthread, die de doelthread kan opvangen. (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 gooit een PlatformNotSupportedException tijdens runtime in .NET Core en .NET 5 en latere versies. Vanaf .NET 5 wordt het ook gemarkeerd als verouderd (SYSLIB0006), waardoor het aanroepen een waarschuwing over de compilatietijd genereert. Als u de uitvoering van code van derden geforceerd wilt beëindigen in moderne .NET-implementaties, voert u deze uit in een afzonderlijk proces en gebruikt u Process.Kill.
Opmerking
- Wanneer u Thread.Abort aanroept om een andere thread dan de huidige thread te stoppen, weet u niet welke code is uitgevoerd of mislukt om uit te voeren wanneer de ThreadAbortException wordt gegooid. U kunt ook niet zeker zijn van de status van uw toepassing, noch van enige toepassings- en gebruikersstatus waarvoor deze verantwoordelijk is om te behouden. Het aanroepen van Thread.Abort kan bijvoorbeeld voorkomen dat statische constructors worden uitgevoerd of dat beheerde of onbeheerde bronnen worden vrijgegeven.
- 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 Thread.Join aanroepen om te 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 Thread.Interrupt aanroepen.
Afhandelen van ThreadAbortException
Als u verwacht dat uw thread wordt afgebroken, hetzij als gevolg van het aanroepen van Abort vanuit uw eigen code of als gevolg van het verwijderen van een toepassingsdomein waarin de thread wordt uitgevoerd (AppDomain.Unload gebruikt Thread.Abort om threads te beëindigen), moet uw thread de ThreadAbortException afhandelen en eventuele laatste verwerking uitvoeren in een finally clausule, 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 clausule of de finally clausule bevinden, omdat ThreadAbortException opnieuw wordt opgegooid door het systeem aan het einde van de finally clausule, of aan het einde van de catch clausule als er geen finally clausule is.
U kunt voorkomen dat het systeem de uitzondering opnieuw gooit door de Thread.ResetAbort methode aan te roepen. U moet dit echter alleen doen als uw eigen code de ThreadAbortExceptionoorzaak is.