gevaarlijkeThreadingAPI MDA
Notitie
Dit artikel is specifiek voor .NET Framework. Dit geldt niet voor nieuwere implementaties van .NET, waaronder .NET 6 en nieuwere versies.
De dangerousThreadingAPI
beheerde foutopsporingsassistent (MDA) wordt geactiveerd wanneer de Thread.Suspend methode wordt aangeroepen op een andere thread dan de huidige thread.
Symptomen
Een toepassing reageert niet. Systeem- of toepassingsgegevens kunnen tijdelijk in een onvoorspelbare status blijven of zelfs nadat een toepassing is afgesloten. Sommige bewerkingen worden niet voltooid zoals verwacht.
Symptomen kunnen sterk variƫren vanwege de willekeurigheid die inherent is aan het probleem.
Oorzaak
Een thread wordt asynchroon onderbroken door een andere thread met behulp van de Suspend methode. Er is geen manier om te bepalen wanneer het veilig is om een andere thread te onderbreken die zich mogelijk midden in een bewerking bevindt. Het onderbreken van de thread kan leiden tot beschadiging van gegevens of het breken van invarianten. Als een thread in een onderbroken status wordt geplaatst en nooit opnieuw wordt hervat met behulp van de Resume methode, kan de toepassing stoppen met reageren en mogelijk schade toebrengen aan toepassingsgegevens. Deze methoden zijn gemarkeerd als verouderd.
Als synchronisatieprimitief wordt vastgehouden door de doelthread, blijven ze bewaard tijdens de schorsing. Dit kan leiden tot impasses als een andere thread, bijvoorbeeld de thread die de Suspendthread uitvoert, probeert een vergrendeling op de primitieve te verkrijgen. In deze situatie is het probleem een impasse.
Oplossing
Vermijd ontwerpen waarvoor het gebruik van Suspend en Resume. Gebruik voor samenwerking tussen threads synchronisatieprimitief zoals Lock, Monitor, ReaderWriterLock, Mutexof de C# lock
-instructie. Als u deze methoden moet gebruiken, vermindert u het tijdvenster en minimaliseert u de hoeveelheid code die wordt uitgevoerd terwijl de thread een onderbroken status heeft.
Effect op de runtime
Deze MDA heeft geen effect op de CLR. Er worden alleen gegevens gerapporteerd over gevaarlijke threadingbewerkingen.
Uitvoer
De MDA identificeert de gevaarlijke threadingmethode die ervoor zorgde dat deze werd geactiveerd.
Configuratie
<mdaConfig>
<assistants>
<dangerousThreadingAPI />
</assistants>
</mdaConfig>
Opmerking
In het volgende codevoorbeeld ziet u een aanroep van de Suspend methode die de activering van de 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();
}