MDA dangerousThreadingAPI
Nota
Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, incluse .NET 6 e versioni successive.
L'assistente al debug gestito dangerousThreadingAPI
viene attivato quando il metodo Thread.Suspend viene chiamato per un thread diverso da quello attuale.
Sintomi
Un'applicazione non risponde. È possibile che i dati del sistema e dell'applicazione rimangano in uno stato non prevedibile temporaneamente o anche dopo la chiusura di un'applicazione. Alcune operazioni non vengono completate come previsto.
I sintomi possono variare ampiamente a causa della casualità implicita nel problema.
Causa
Un thread viene sospeso in modo asincrono da un altro thread tramite il metodo Suspend. Non c'è modo di stabilire se sia sicuro sospendere un altro thread che potrebbe avere un'operazione in corso. La sospensione del thread può causare il danneggiamento dei dati o l'interruzione di invariabili. Se un thread viene inserito in uno stato sospeso e non viene mai ripreso usando il Resume metodo , l'applicazione può smettere di rispondere ed eventualmente danneggiare i dati dell'applicazione. Questi metodi sono stati contrassegnati come obsoleti.
Se le primitive di sincronizzazione si trovano nel thread di destinazione, vi rimarranno durante la sospensione, con la possibilità di un 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 si manifesta sotto forma di deadlock.
Risoluzione
Evitare progettazioni che richiedano l'uso di Suspend e Resume. Per la cooperazione tra thread, usare primitive di sincronizzazione come Lock, Monitor, ReaderWriterLockMutex, o l'istruzione C#lock
. Se è necessario usare questi metodi, ridurre il periodo di tempo e la quantità di codice eseguito quando il thread si trova in uno stato di sospensione.
Effetto sull'ambiente di esecuzione
L'assistente al debug gestito non ha alcun effetto 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 di threading dannoso che ha causato l'attivazione dell'assistente stesso.
Impostazione
<mdaConfig>
<assistants>
<dangerousThreadingAPI />
</assistants>
</mdaConfig>
Esempio
Il codice di esempio seguente illustra 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();
}