dangerousThreadingAPI-MDA
Der dangerousThreadingAPI-MDA (Managed Debugging Assistant, Assistent für verwaltetes Debuggen) wird aktiviert, wenn für einen anderen als den aktuellen Thread die Thread.Suspend-Methode aufgerufen wird.
Symptome
Eine Anwendung reagiert nicht mehr. System- oder Anwendungsdaten befinden sich vorübergehend oder selbst nach dem Beenden der Anwendung in einem nicht vorhersagbaren Zustand. Einige Vorgänge werden nicht wie erwartet abgeschlossen.
Aufgrund des willkürlichen Auftretens dieses Problems ist ein breites Spektrum unterschiedlicher Symptome möglich.
Ursache
Ein Thread wird asynchron von einem anderen Thread mit der Suspend-Methode unterbrochen. Es gibt keine Möglichkeit festzustellen, wann ein anderer Thread gefahrlos unterbrochen werden kann, der möglicherweise gerade einen Vorgang ausführt. Das Unterbrechen des Threads kann zur Beschädigung von Daten oder Invarianten führen. Wenn ein Thread in einen Unterbrechungszustand versetzt und niemals mit der Resume-Methode fortgesetzt wird, reagiert die Anwendung nicht mehr, und es kommt möglicherweise zur Beschädigung von Anwendungsdaten. Diese Methoden wurden als veraltet gekennzeichnet.
Wenn Synchronisierungsgrundelemente vom Zielthread angehalten wurden, bleiben sie während der Unterbrechung in diesem Zustand. Dies kann zu Deadlocks führen, wenn ein anderer Thread (z. B. der Thread für das Suspend) versucht, das Grundelement zu sperren. In dieser Situation macht sich das Problem als Deadlock bemerkbar.
Lösung
Vermeiden Sie Entwürfe, die die Verwendung von Suspend und Resume erfordern. Verwenden Sie für die Interaktion zwischen Threads Synchronisierungsgrundelemente wie Monitor, ReaderWriterLock, Mutex oder die C#-Anweisung lock. Wenn Sie diese Methoden unbedingt einsetzen müssen, verringern Sie das Zeitfenster und die Menge des Codes, der während der Unterbrechung des Threads ausgeführt wird.
Auswirkungen auf die Laufzeit
Dieser MDA hat keine Auswirkungen auf die CLR. Es werden nur Angaben zu risikobehafteten Threadingvorgängen gemeldet.
Output
Der MDA meldet die risikobehaftete Threadingmethode, die zur Aktivierung des Assistenten führte.
Konfiguration
<mdaConfig>
<assistants>
<dangerousThreadingAPI />
</assistants>
</mdaConfig>
Beispiel
Im folgenden Codebeispiel wird ein Aufruf der Suspend-Methode veranschaulicht, der zur Aktivierung des dangerousThreadingAPI-MDA führt.
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();
}
Siehe auch
Referenz
Konzepte
Diagnostizieren von Fehlern mit Assistenten für verwaltetes Debuggen