dangerousThreadingAPI MDA
Kommentar
Den här artikeln är specifik för .NET Framework. Det gäller inte för nyare implementeringar av .NET, inklusive .NET 6 och senare versioner.
Den dangerousThreadingAPI
hanterade felsökningsassistenten Thread.Suspend (MDA) aktiveras när metoden anropas på en annan tråd än den aktuella tråden.
Symtom
Ett program svarar inte. System- eller programdata kan lämnas i ett oförutsägbart tillstånd tillfälligt eller till och med efter att ett program har stängts av. Vissa åtgärder slutförs inte som förväntat.
Symtomen kan variera kraftigt på grund av den slumpmässighet som är inneboende i problemet.
Orsak
En tråd pausas asynkront av en annan tråd med hjälp av Suspend metoden . Det finns inget sätt att avgöra när det är säkert att pausa en annan tråd som kan vara mitt i en åtgärd. Om tråden pausas kan data skadas eller att invarianter bryts. Om en tråd placeras i ett pausat tillstånd och aldrig återupptas med metoden Resume kan programmet sluta svara och eventuellt skada programdata. Dessa metoder har markerats som föråldrade.
Om synkroniseringens primitiver hålls av måltråden förblir de kvar under fjädringen. Detta kan leda till dödlägen om en annan tråd, till exempel tråden Suspendsom utför , försöker hämta ett lås på primitiven. I den här situationen visar sig problemet som ett dödläge.
Åtgärd
Undvik design som kräver användning av Suspend och Resume. För samarbete mellan trådar använder du synkroniseringspri primitiver som Lock, Monitor, ReaderWriterLock, Mutexeller C#- lock
instruktionen. Om du måste använda dessa metoder kan du minska tidsperioden och minimera mängden kod som körs medan tråden är i pausat tillstånd.
Effekt på körningen
Denna MDA har ingen effekt på CLR. Den rapporterar endast data om farliga trådåtgärder.
Output
MDA identifierar den farliga trådningsmetod som gjorde att den aktiverades.
Konfiguration
<mdaConfig>
<assistants>
<dangerousThreadingAPI />
</assistants>
</mdaConfig>
Exempel
I följande kodexempel visas ett anrop till metoden Suspend som orsakar aktiveringen av 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();
}