MDA de dangerousThreadingAPI

Actualización: noviembre 2007

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

Síntomas

Hay una aplicación que no responde o que está bloqueada indefinidamente. Ciertos datos de sistema o de programa podrían quedar temporalmente en un estado imprevisible, incluso después de haber cerrado la aplicación. Algunas operaciones no están finalizando como se esperaba.

Los síntomas pueden ser muy variados, debido a la aleatoriedad inherente al problema.

Motivo

Un subproceso es suspendido de forma asincrónica por otro subproceso mediante el método Suspend. No hay manera de determinar en qué momento es seguro suspender otro subproceso que podría estar en medio de una operación. Suspender el subproceso puede producir daños en los datos o la ruptura de invariantes. Si se colocase un subproceso en estado de suspensión y no se volviese a reiniciar mediante el método Resume, la aplicación podría quedar bloqueada indefinidamente y posiblemente se produjese algún daño en los datos del programa. Estos métodos se han marcado como obsoletos.

Si el subproceso de destino contiene primitivos de sincronización, éstos permanecerán así durante la suspensión. Esto podría conducir a una situación de interbloqueo en caso de que otro subproceso, por ejemplo el subproceso que está realizando el método Suspend, intentase adquirir un bloqueo en el primitivo. En esta situación, el problema se manifiesta como un interbloqueo.

Resolución

Evite diseños que requieran el uso de Suspend y Resume. Para la cooperación entre subprocesos, utilice primitivos de sincronización como Monitor, ReaderWriterLock, Mutex o la instrucción lock de C#. Si tuviese que utilizar estos métodos, reduzca la ventana de tiempo y minimice la cantidad de código en ejecución mientras el subproceso está en estado de suspensión.

Efecto en Common Language Runtime

Este Ayudante para la depuración administrada no tiene efecto en Common Language Runtime. Sólo comunica datos sobre operaciones de subprocesamiento peligrosas.

Resultados

El Ayudante para la depuración administrada identifica el método de subprocesamiento peligroso que produjo su activación.

Configuración

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

Ejemplo

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

Vea también

Conceptos

Diagnóstico de errores con ayudantes de depuraciones administradas

Referencia

Thread

lock (Instrucción, Referencia de C#)