dangerousThreadingAPI 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 dangerousThreadingAPI
felügyelt hibakeresési segéd (MDA) akkor aktiválódik, ha a metódust az Thread.Suspend aktuális száltól eltérő szálon hívják meg.
Hibajelenségek
Az alkalmazások nem válaszolnak. Előfordulhat, hogy a rendszer- vagy alkalmazásadatok kiszámíthatatlan állapotban maradnak ideiglenesen, vagy akár egy alkalmazás leállítása után is. Egyes műveletek nem a várt módon befejeződnek.
A tünetek a probléma természetéből adódó véletlenszerűség miatt széles körben változhatnak.
Ok
Egy szálat egy másik szál aszinkron módon függeszt fel a Suspend metódus használatával. Nem lehet megállapítani, hogy mikor lehet biztonságosan felfüggeszteni egy másik szálat, amely egy művelet közepén lehet. A szál felfüggesztése adatsérülést vagy a változók feltörését eredményezheti. Ha egy szálat felfüggesztett állapotba helyeznek, és soha nem folytatják a Resume módszerrel, az alkalmazás nem válaszolhat, és esetleg károsíthatja az alkalmazás adatait. Ezek a módszerek elavultként lettek megjelölve.
Ha a szinkronizálási primitíveket a célszál tartja, azok felfüggesztés alatt maradnak. Ez holtpontokhoz vezethet, ha egy másik szál, például az Suspendazt végrehajtó szál megpróbál zárolást szerezni a primitíven. Ebben a helyzetben a probléma holtpontként jelentkezik.
Resolution (Osztás)
Kerülje azokat a kialakításokat, amelyek használatához Suspend és Resume. A szálak közötti együttműködéshez használjon olyan szinkronizálási primitíveket, mint a Lock, Monitor, ReaderWriterLock, Mutexvagy a C# lock
utasítás. Ha ezeket a módszereket kell használnia, csökkentse az időkeretet, és minimalizálja a szál felfüggesztett állapotában végrehajtott kód mennyiségét.
Effektus a futtatókörnyezetre
Ez az MDA nincs hatással a CLR-re. Csak a veszélyes szálkezelési műveletek adatait jelenti.
Hozam
Az MDA azonosítja a veszélyes menetelési módszert, amely az aktiválását okozta.
Konfiguráció
<mdaConfig>
<assistants>
<dangerousThreadingAPI />
</assistants>
</mdaConfig>
Példa
Az alábbi példakód bemutatja a Suspend metódus meghívását, amely a rendszer aktiválását dangerousThreadingAPI
okozza.
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();
}
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: