dangerousThreadingAPI – 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 dangerousThreadingAPI
spravovaného ladění (MDA) se aktivuje, když Thread.Suspend je metoda volána v jiném vlákně, než je aktuální vlákno.
Příznaky
Aplikace nereaguje. Systémová nebo aplikační data můžou být dočasně ponechána v nepředvídatelném stavu nebo dokonce i po vypnutí aplikace. Některé operace se nedokončují podle očekávání.
Příznaky se mohou značně lišit kvůli náhodnosti, která je problémem spojená.
Příčina
Vlákno je asynchronně pozastaveno jiným vláknem pomocí Suspend metody. Neexistuje způsob, jak určit, kdy je bezpečné pozastavit jiné vlákno, které může být uprostřed operace. Pozastavení vlákna může vést k poškození dat nebo přerušení invariantů. Je-li vlákno umístěno do pozastaveného stavu a nikdy pokračovat pomocí Resume metody, aplikace může přestat reagovat a případně poškodit data aplikace. Tyto metody byly označeny jako zastaralé.
Pokud se primitivy synchronizace uchovávají v cílovém vlákně, zůstanou během pozastavení zachovány. To může vést k zablokování by mělo jiné vlákno, například vlákno provádějící Suspend, pokus o získání zámku na primitivu. V této situaci se problém projevuje jako vzájemné zablokování.
Rozlišení
Vyhněte se návrhům, které vyžadují použití Suspend a Resume. Pro spolupráci mezi vlákny použijte primitivy synchronizace, jako Lockje , Monitor, ReaderWriterLock, Mutexnebo příkaz jazyka C# lock
. Pokud je nutné použít tyto metody, zkraťte časový interval a minimalizujte množství kódu, který se spustí v době, kdy je vlákno v pozastaveném stavu.
Vliv na modul runtime
Tento mdA nemá žádný vliv na CLR. Hlásí pouze data o nebezpečných operacích s vlákny.
Výstup
MdA identifikuje nebezpečnou metodu threadingu, která způsobila jeho aktivaci.
Konfigurace
<mdaConfig>
<assistants>
<dangerousThreadingAPI />
</assistants>
</mdaConfig>
Příklad
Následující příklad kódu ukazuje volání Suspend metody, která způsobuje aktivaci dangerousThreadingAPI
.
using System.Threading;
void FireMda()
{
Thread t = new Thread(delegate() { Thread.Sleep(1000); });
t.Start();
// The following line activates the MDA.
t.Suspend();
t.Resume();
t.Join();
}