Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A szál végrehajtásának leállításához általában a kooperatív lemondási modellt kell használnia. Néha azonban nem lehet egy szálat együttműködő módon leállítani, mert olyan külső kódot futtat, amelyet nem kooperatív lemondásra terveztek. A .NET-keretrendszer alkalmazásaiban a Thread.Abort metódussal kényszerítve szakíthat meg egy felügyelt szálat. Híváskor Aborta Common Language Runtime bedob egy ThreadAbortException elemet a célszálba, amelyet a célszál képes elkapni. (A .NET-keretrendszer futtatókörnyezete azonban mindig automatikusan újra beszedi a kivételt a catch blokk után.) További információ: Thread.Abort.
A Thread.Abort metódus futásidőben a .NET Core- és .NET 5-ös és újabb verziókban is használható PlatformNotSupportedException . A .NET 5-től kezdve ezt elavultnak (SYSLIB0006) is jelölték, ezért a meghívása fordítási időbeli figyelmeztetést eredményez. Ha a modern .NET-implementációkban kényszerítve kell leállítania a külső kód végrehajtását, futtassa azt külön folyamatban, és használja Process.Kill.
Megjegyzés:
- Amikor az aktuális száltól eltérő szál megszakítására hívja meg a hívást Thread.Abort , nem tudja, hogy milyen kódot hajtottak végre, vagy nem sikerült végrehajtani a ThreadAbortException dobáskor. Nem lehetsz biztos az alkalmazás állapotában vagy bármely olyan állapotban, amelyet az alkalmazásnak és a felhasználónak meg kell őriznie. A hívás Thread.Abort például megakadályozhatja a statikus konstruktorok végrehajtását, illetve a felügyelt vagy nem felügyelt erőforrások kiadását.
- Ha egy szál nem felügyelt kódot futtat, amikor a saját Abort metódusát hívják meg, a futtatókörnyezet megjelöli szálat ThreadState.AbortRequested. A kivétel akkor fordul elő, ha a szál visszatér a felügyelt kódhoz.
Miután megszakított egy szálat, nem indítható újra.
A Abort metódus nem okozza azonnal a szál megszakítását, mert a célszál képes elfogni, és tetszőleges mennyiségű kódot végrehajtani egy ThreadAbortExceptionfinally blokkban. Hívhatja a Thread.Join-t, ha várnia kell, amíg a szál befejeződik.
Thread.Join egy blokkoló hívás, amely addig nem tér vissza, amíg a szál ténylegesen le nem áll a végrehajtásról, vagy el nem telik egy opcionális időtúllépési időköz. A megszakított szál meghívhatja a ResetAbort metódust, vagy korlátlan feldolgozást végezhet egy finally blokkban, így, ha nem ad meg időtúllépést, a várakozás vége nincs garantálva.
A Thread.Join metódus hívására várakozó szálakat más szálak megszakíthatják, amelyek Thread.Interrupt hívást kezdeményeznek.
ThreadAbortException kezelése
Ha arra számít, hogy a szál megszakad, akár a saját kódból való hívás Abort , akár egy olyan alkalmazástartomány kiürítése miatt, amelyben a szál fut (AppDomain.Unload a szálak leállítására szolgál Thread.Abort ), a szálnak kezelnie kell a ThreadAbortException szálat, és végre kell hajtania a végleges feldolgozást egy finally záradékban, ahogyan az az alábbi kódban is látható.
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.
A törlési kódnak a catch vagy a finally záradékban kell lennie, mert a rendszer a ThreadAbortException záradék végét követően újra dobja a kivételt, vagy ha nincs finally záradék, akkor a catch záradék végén.
A Thread.ResetAbort metódus meghívásával megakadályozhatja, hogy a rendszer újradobja a kivételt. Ezt azonban csak akkor kell megtennie, ha a saját kódja okozta a ThreadAbortException.