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


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 dangerousThreadingAPIokozza.

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