Condividi tramite


MDA dangerousThreadingAPI

Aggiornamento: novembre 2007

L'assistente al debug gestito dangerousThreadingAPI viene attivato quando il metodo Thread.Suspend viene chiamato su un thread diverso da quello attuale.

Sintomi

Un'applicazione non risponde o si blocca in modo indefinito. È possibile che i dati del sistema e dell'applicazione vengano lasciati in uno stato imprevedibile temporaneamente o anche dopo la chiusura dell'applicazione. Alcune operazioni non vengono eseguite come previsto.

I sintomi variano ampiamente a causa della casualità implicita nel problema.

Causa

Un thread viene sospeso in modo asincrono da un altro thread mediante il metodo Suspend. Non esiste modo di stabilire quando sia sicuro sospendere un altro thread mentre è in corso qualche relativa operazione. La sospensione del thread può determinare il danneggiamento dei dati o l'interruzione della lingua invariabile. Qualora un thread dovesse essere inserito in uno stato di sospensione e mai ripreso mediante il metodo Resume, è possibile che l'applicazione si blocchi in modo indefinito e che i relativi dati vengano danneggiati. Questi metodi sono stati contrassegnati come obsoleti.

Se le primitive di sincronizzazione sono contenute nel thread di destinazione, rimarranno in tale posizione durante la sospensione causando probabilmente deadlock se un altro thread, ad esempio quello che esegue il metodo Suspend, tenta di acquisire un blocco sulla primitiva. In questa situazione il problema stesso si manifesta come deadlock.

Risoluzione

Evitare progettazioni in cui sia richiesto l'utilizzo di Suspend e Resume. Per l'interazione tra thread, utilizzare le primitive di sincronizzazione, quali Monitor, ReaderWriterLock, Mutex o l'istruzione C# lock. Se è necessario utilizzare questi metodi, ridurre il periodo di tempo e la quantità di codice eseguito quando il thread si trova in uno stato di sospensione.

Effetto sul runtime

Questo assistente al debug gestito non produce effetti su CLR. Si limita a generare un report dei dati relativi alle operazioni di threading dannose.

Output

L'assistente al debug gestito identifica il metodo threading dannoso che ne ha provocato l'attivazione.

Configurazione

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

Esempio

Nell'esempio di codice riportato di seguito viene illustrata una chiamata al metodo Suspend che causa l'attivazione di 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();
}

Vedere anche

Concetti

Diagnostica degli errori tramite gli assistenti al debug gestito

Riferimenti

Thread

Istruzione lock (Riferimenti per C#)