Comparteix a través de


MDA de dangerousThreadingAPI

Nota:

Este artículo es específico de .NET Framework. No se aplica a implementaciones más recientes de .NET, incluidas .NET 6 y versiones posteriores.

El Asistente para la depuración administrada (MDA) de dangerousThreadingAPI se activa cuando se llama al método Thread.Suspend en un subproceso diferente al subproceso actual.

Síntomas

La aplicación no responde. Los datos de la aplicación o el sistema pueden permanecer en un estado imprevisible temporalmente o incluso después de que una aplicación se haya cerrado. Algunas operaciones no se completan según lo esperado.

Los síntomas pueden variar enormemente debido a la aleatoriedad inherente al problema.

Causa

Un subproceso está suspendido de manera asincrónica mediante otro subproceso que usa el método Suspend. No existe ninguna manera de determinar cuándo es seguro suspender otro subproceso que puede encontrarse en el proceso de una operación. La suspensión del subproceso puede provocar daños en los datos o la interrupción de invariantes. Si un subproceso se coloca en un estado suspendido y nunca se reanuda con el método Resume, la aplicación puede dejar de responder y posiblemente dañe los datos de la aplicación. Estos métodos se han marcado como obsoletos.

Si los tipos primitivos de sincronización se incluyen en el subproceso de destino, permanecen así durante la suspensión. Esto puede provocar interbloqueos si otro subproceso, por ejemplo el subproceso que realiza Suspend, intenta adquirir un bloqueo en el tipo primitivo. En esta situación, el problema se manifiesta como un interbloqueo.

Solución

Evite diseños que necesiten el uso de Suspend y Resume. Para la cooperación entre subprocesos, use primitivos de sincronización como Lock, Monitor, ReaderWriterLock, Mutexo la instrucción de C# lock . Si debe usar estos métodos, reduzca el período de tiempo y minimice la cantidad de código que ejecuta mientras el subproceso está en un estado suspendido.

Efecto en el Runtime

Este MDA no tiene ningún efecto en el CLR. Solo notifica datos sobre operaciones de subproceso peligrosas.

Output

El MDA identifica el método de subproceso peligroso que ha provocado que se active.

Configuración

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

Ejemplo

En el ejemplo de código siguiente se muestra una llamada al método Suspend que provoca la activación 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();
}

Consulte también