Megosztás a következőn keresztül:


aszinkronThreadAbort MDA

Feljegyzés

Ez a cikk a .NET-keretrendszer vonatkozik. Ez nem vonatkozik a .NET újabb implementációira, beleértve a .NET 6-os és újabb verzióit.

A asynchronousThreadAbort felügyelt hibakeresési segéd (MDA) akkor aktiválódik, ha egy szál aszinkron megszakítást kísérel meg egy másik szálba. A szinkron szál megszakításai nem aktiválják az asynchronousThreadAbort MDA-t.

Hibajelenségek

A fő alkalmazásszál megszakításakor az alkalmazás nem kezelt ThreadAbortException módon összeomlik. Ha az alkalmazás továbbra is végrehajtásra kerül, a következmények rosszabbak lehetnek, mint az alkalmazás összeomlása, ami további adatsérülést okozhat.

Az atominak szánt műveletek valószínűleg megszakadtak a részleges befejezés után, így az alkalmazás adatai kiszámíthatatlan állapotban maradnak. A ThreadAbortException kód végrehajtásának látszólag véletlenszerű pontjaiból hozható létre, gyakran olyan helyeken, ahonnan nem várható kivétel. Előfordulhat, hogy a kód nem képes kezelni egy ilyen kivételt, ami sérült állapotot eredményez.

A tünetek a probléma természetéből adódó véletlenszerűség miatt széles körben változhatnak.

Ok

Az egyik szálban található kód egy Thread.Abort célszál metódusának nevezik az aszinkron szál megszakításának bevezetéséhez. A szál megszakítása aszinkron, mert a hívást Abort kezdeményező kód más szálon fut, mint a megszakított művelet célja. A szinkron szál megszakításai nem okozhatnak problémát, mert az azt végrehajtó Abort szálnak csak egy biztonságos ellenőrzőponton kellett volna elvégeznie, ahol az alkalmazás állapota konzisztens.

Az aszinkron szál megszakításai problémát okoznak, mert a célszál végrehajtásának kiszámíthatatlan pontjain dolgozzák fel őket. Ennek elkerülése érdekében az ilyen módon megszakítható szálon való futtatásra írt kódnak szinte minden kódsort kezelnie ThreadAbortException kell, ügyelve arra, hogy az alkalmazásadatok konzisztens állapotba kerüljenek. Nem reális elvárni, hogy a kódot ezzel a problémával együtt írják meg, vagy olyan kódot írjanak, amely minden lehetséges körülmény ellen védelmet nyújt.

A nem felügyelt kódba és finally blokkokba irányuló hívásokat nem aszinkron módon, hanem azonnal megszakítjuk, amikor kilépünk ezen kategóriák egyikéből.

Az ok nehezen határozható meg a probléma véletlenszerűsége miatt.

Resolution (Osztás)

Kerülje az aszinkron szál megszakítását igénylő kódtervezést. A célszál megszakításához több olyan megközelítés is létezik, amelyek nem igényelnek Aborthívást. A legbiztonságosabb egy olyan mechanizmus, például egy közös tulajdonság bevezetése, amely jelzi a célszálat, hogy megszakítást kérjen. A célszál bizonyos biztonságos ellenőrzőpontokon ellenőrzi a jelet. Ha azt észleli, hogy a rendszer megszakítást kért, a rendszer kecsesen leállhat.

Effektus a futtatókörnyezetre

Ez az MDA nincs hatással a CLR-re. Csak az aszinkron szál megszakításairól jelent adatokat.

Hozam

Az MDA jelenti a megszakítást végrehajtó szál azonosítóját és a megszakítás célját képező szál azonosítóját. Ezek soha nem lesznek azonosak, mert ez aszinkron megszakításokra korlátozódik.

Konfiguráció

<mdaConfig>
  <assistants>
    <asynchronousThreadAbort />
  </assistants>
</mdaConfig>

Példa

Az MDA aktiválásához asynchronousThreadAbort csak egy külön futó szálra irányuló Abort hívás szükséges. Vegye figyelembe a következményeket, ha a szálindítási függvény tartalma összetettebb műveletek halmaza, amelyeket a megszakítás bármely tetszőleges pontján megszakíthat.

using System.Threading;
void FireMda()
{
    Thread t = new Thread(delegate() { Thread.Sleep(1000); });
    t.Start();
    // The following line activates the MDA.
    t.Abort();
    t.Join();
}

Lásd még