Share via


Assistant Débogage managé dangerousThreadingAPI

L’Assistant Débogage managé (MDA, Managed Debugging Assistant) dangerousThreadingAPI est activé quand la méthode Thread.Suspend est appelée sur un thread autre que le thread actif.

Symptômes

Une application ne répond pas. Les données système ou d’application peuvent se retrouver dans un état imprévisible de façon temporaire ou même après l’arrêt d’une application. Certaines opérations ne se terminent pas comme prévu.

Les symptômes peuvent varier considérablement en raison du caractère aléatoire du problème.

Cause

Un thread est suspendu de façon asynchrone par un autre thread à l’aide de la méthode Suspend. Il n’existe aucun moyen de déterminer le moment le plus sûr pour suspendre un autre thread pouvant se trouver en cours d’opération. La suspension du thread peut entraîner l’altération des données ou des invariants. Si un thread est suspendu et n’est jamais repris en utilisant la méthode Resume, l’application peut cesser de répondre et possiblement endommager les données de l’application. Ces méthodes ont été marquées comme obsolètes.

Si les primitives de synchronisation sont détenues par le thread cible, elles restent détenues pendant la suspension. Cela peut entraîner des interblocages si un autre thread, par exemple le thread qui exécute Suspend, tente d’acquérir un verrou sur la primitive. Dans ce cas, le problème se manifeste sous le forme d’un interblocage.

Résolution

Évitez les conceptions qui nécessitent l’utilisation de Suspend et Resume. Pour la coopération entre les threads, utilisez des primitives de synchronisation telles que Lock, , MonitorReaderWriterLock, Mutex, ou l’instruction C#lock. Si vous devez utiliser ces méthodes, réduisez la durée et la quantité de code qui s’exécute pendant que le thread est suspendu.

Effet sur le runtime

Cet Assistant Débogage managé n'a aucun effet sur le CLR. Il signale uniquement les données relatives aux opérations de thread dangereuses.

Sortie

L’Assistant Débogage managé identifie la méthode de thread dangereuse qui a entraîné son activation.

Configuration

<mdaConfig>  
  <assistants>  
    <dangerousThreadingAPI />  
  </assistants>  
</mdaConfig>  

Exemple

L’exemple de code suivant illustre un appel à la méthode Suspend qui entraîne l’activation 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();  
}  

Voir aussi