Partager via


Assistant Débogage managé dangerousThreadingAPI

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

Symptômes

Une application ne répond pas ou se bloque indéfiniment. 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'est pas possible 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 à l'aide de la méthode Resume, l'application peut se bloquer indéfiniment et même endommager les données d'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 comme un interblocage.

Solution

Évitez les designs qui requièrent l'utilisation de Suspend et Resume. Pour la coopération entre les threads, utilisez des primitives de synchronisation telles que Monitor, ReaderWriterLock, Mutex ou l'instruction lock du C#. 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

Ce MDA n'a aucun effet sur le CLR. Il signale uniquement des données relatives aux opérations de thread dangereuses.

Sortie

Le MDA 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

Référence

Thread

lock, instruction (référence C#)

Concepts

Diagnostic d'erreurs avec les Assistants de débogage managés