Sdílet prostřednictvím


asynchronousThreadAbort – pomocník spravovaného ladění (MDA)

Poznámka:

Tento článek je specifický pro rozhraní .NET Framework. Nevztahuje se na novější implementace .NET, včetně .NET 6 a novějších verzí.

Pomocník asynchronousThreadAbort spravovaného ladění (MDA) se aktivuje, když se vlákno pokusí zavést asynchronní přerušení do jiného vlákna. Synchronní přerušení vlákna neaktivují asynchronousThreadAbort MDA.

Příznaky

Při přerušení hlavního vlákna aplikace dojde k chybovému ukončení aplikace s neošetřenou ThreadAbortException chybou. Pokud by aplikace pokračovala ve spuštění, můžou být důsledky horší než chybové ukončení aplikace, což může mít za následek další poškození dat.

Operace, které mají být atomické, se pravděpodobně přerušily po částečném dokončení, takže data aplikací byly nepředvídatelné. Je ThreadAbortException možné vygenerovat z zdánlivě náhodných bodů při provádění kódu, často na místech, odkud se očekává výjimka, která se neočekává. Kód nemusí být schopen takovou výjimku zpracovat, což vede k poškození.

Příznaky se mohou značně lišit kvůli náhodnosti, která je problémem spojená.

Příčina

Kód v jednom vlákně volal metodu Thread.Abort v cílovém vlákně pro zavedení asynchronního přerušení vlákna. Přerušení vlákna je asynchronní, protože kód, který provádí volání Abort , běží na jiném vlákně než cíl operace přerušení. Synchronní přerušení vlákna by nemělo způsobit problém, protože vlákno, které Abort provádí, by to mělo provést, tak pouze na bezpečném kontrolním bodu, kde je stav aplikace konzistentní.

Asynchronní vlákna přeruší problém, protože se zpracovávají v nepředvídatelných bodech spuštění cílového vlákna. Aby se tomu zabránilo, bude nutné kód napsaný tak, aby běžel ve vlákně, které by tímto způsobem mohlo být přerušeno, zpracovávat ThreadAbortException téměř každý řádek kódu a postarat se o umístění aplikačních dat zpět do konzistentního stavu. Není reálné očekávat, že kód se zapíše s ohledem na tento problém nebo napíše kód, který chrání před všemi možnými okolnostmi.

Volání nespravovaného kódu a finally bloků nebudou přerušena asynchronně, ale okamžitě po ukončení jedné z těchto kategorií.

Příčinou může být obtížné určit kvůli náhodnosti, která je podstatou problému.

Rozlišení

Vyhněte se návrhu kódu, který vyžaduje použití asynchronních vláken přerušených. Existuje několik přístupů vhodnějších pro přerušení cílového vlákna, které nevyžadují volání Abort. Nejbezpečnější je zavést mechanismus, jako je například společná vlastnost, která signalizuje cílové vlákno, aby požádalo o přerušení. Cílové vlákno kontroluje signál na určitých bezpečných kontrolních bodech. Pokud si všimne, že bylo požadováno přerušení, může se řádně vypnout.

Vliv na modul runtime

Tento mdA nemá žádný vliv na CLR. Hlásí pouze data o asynchronních přerušeních vláken.

Výstup

MDA hlásí ID vlákna provádějícího přerušení a ID vlákna, které je cílem přerušení. Tyto hodnoty nebudou nikdy stejné, protože to je omezené na asynchronní přerušení.

Konfigurace

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

Příklad

Aktivace asynchronousThreadAbort MDA vyžaduje pouze volání Abort na samostatné spuštěné vlákno. Zvažte důsledky, pokud obsah spouštěcí funkce vlákna byl sada složitějších operací, které by mohly být přerušeny v libovolném bodě přerušením.

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();
}

Viz také