dangerousThreadingAPI-MDA

Der dangerousThreadingAPI-MDA (Managed Debugging Assistant, Assistent für verwaltetes Debuggen) wird aktiviert, wenn die Thread.Suspend-Methode für einen anderen Thread als den aktuellen Thread aufgerufen wird.

Symptome

Eine Anwendung reagiert nicht. Die System- oder Anwendungsdaten befinden sich vorübergehend oder selbst nach Herunterfahren der Anwendung in einem unvorhersehbaren Zustand. Einige Vorgänge werden nicht wie erwartet abgeschlossen.

Die Symptome sind aufgrund der Zufälligkeit dieses Problems breit gefächert.

Ursache

Ein Thread wird von einem anderen Thread mit der Suspend-Methode asynchron angehalten. Es gibt keine Möglichkeit festzustellen, wann ein anderer Thread sicher angehalten werden kann, der sich möglicherweise gerade mitten in einem Vorgang befindet. Das Anhalten eines Threads kann zur Beschädigung von Daten oder Invarianten führen. Befindet sich ein Thread in angehaltenem Zustand und wird nicht mit der Resume-Methode fortgesetzt, kann die Anwendung nicht mehr reagieren und möglicherweise Anwendungsdaten beschädigen. Diese Methoden wurden als veraltet markiert.

Für den Zielthread reservierte Synchronisierungsprimitiven bleiben während der Unterbrechung reserviert. Dies kann zu Deadlocks führen, sollte ein anderer Thread versuchen, die Primitive zu sperren (z.B. der Thread, der Suspend ausführt). In diesem Fall wird das Problem als Deadlock sichtbar.

Lösung

Vermeiden Sie Entwürfe, die die Verwendung von Suspend und Resume erfordern. Verwenden Sie für die Zusammenarbeit zwischen Threads Synchronisierungsprimitiven wie beispielsweise Monitor, ReaderWriterLock, Mutex oder die C#-Anweisung lock. Wenn Sie diese Methoden verwenden müssen, verringern Sie das Zeitfenster, und minimieren Sie die Codemenge, die ausgeführt wird, während sich der Thread in angehaltenem Zustand befindet.

Auswirkungen auf die Laufzeit

Dieser MDA hat keine Auswirkungen auf die CLR. Es werden nur Angaben über problematische Threadoperationen gemeldet.

Output

Der MDA identifiziert die problematische Threadmethode, die zu seiner Aktivierung führte.

Konfiguration

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

Beispiel

Das folgende Codebeispiel veranschaulicht einen Aufruf der Suspend-Methode, der zur Aktivierung des dangerousThreadingAPI 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