Elemento <ThrowUnobservedTaskExceptions>

Especifica si las excepciones de tareas no controladas deben finalizar un proceso en ejecución.

<configuration>
  <runtime>
    <ThrowUnobservedTaskExceptions>

Sintaxis

<ThrowUnobservedTaskExceptions  
   enabled="true|false"/>  

Atributos y elementos

En las siguientes secciones se describen los atributos, los elementos secundarios y los elementos primarios.

Atributos

Atributo Descripción
enabled Atributo necesario.

Especifica si las excepciones de tareas no controladas deben finalizar el proceso en ejecución.

Atributo enabled

Valor Descripción
false No finaliza el proceso en ejecución para una excepción de tarea no controlada. Este es el valor predeterminado.
true Finaliza el proceso en ejecución para una excepción de tarea no controlada.

Elementos secundarios

Ninguno.

Elementos primarios

Elemento Descripción
configuration Elemento raíz de cada archivo de configuración usado por las aplicaciones de Common Language Runtime y .NET Framework.
runtime Contiene información sobre las opciones de inicialización del motor en tiempo de ejecución.

Comentarios

Si no se ha observado ninguna excepción asociada a Task, no hay ninguna operación Wait, el elemento primario no está asociado y la propiedad Task.Exception no se leyó la excepción de tarea se considera no observada.

En .NET Framework 4, de manera predeterminada, si un elemento Task que tiene una excepción no observada se recolecta como elemento no utilizado, el finalizador lanza una excepción y termina el proceso. La finalización del proceso viene determinada por el tiempo de recolección de elementos no utilizados y finalización.

Para facilitar a los desarrolladores escribir código asincrónico basado en tareas, .NET Framework 4.5 cambia este comportamiento predeterminado para las excepciones no observadas. Las excepciones no observadas siguen provocando que se genere el evento UnobservedTaskException, pero, de forma predeterminada, el proceso no finaliza. En su lugar, la excepción se omite después de que se genere el evento, independientemente de si un controlador de eventos observa la excepción.

En .NET Framework 4.5, puede usar el elemento <ThrowUnobservedTaskExceptions> en un archivo de configuración de aplicación para habilitar el comportamiento de .NET Framework 4 de iniciar una excepción.

También puede especificar el comportamiento de excepción de una de las maneras siguientes:

  • Al establecer la variable de entorno COMPlus_ThrowUnobservedTaskExceptions (set COMPlus_ThrowUnobservedTaskExceptions=1).

  • Al establecer el valor DWORD del Registro ThrowUnobservedTaskExceptions = 1 en la clave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework.

Ejemplo 1

En el ejemplo siguiente se muestra cómo habilitar el inicio de excepciones en tareas mediante un archivo de configuración de aplicación.

<configuration>
    <runtime>
        <ThrowUnobservedTaskExceptions enabled="true"/>
    </runtime>
</configuration>  

Ejemplo 2

En el ejemplo siguiente se muestra cómo se produce una excepción no observada desde una tarea. El código debe ejecutarse como un programa publicado para que funcione correctamente.

using System;
using System.Threading;
using System.Collections.Generic;
using System.Threading.Tasks;

//Use the following config settings to enable the throwing of unobserved exceptions.
//    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
//    <ThrowUnobservedTaskExceptions enabled="true"/>

public class Example
{
    static void Main()
    {
        Task.Run(() => { throw new InvalidOperationException("test"); });
        while (true)
        {
            Thread.Sleep(100);
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
    }
}
Imports System.Threading
Imports System.Threading.Tasks

'Use the following config settings to enable the throwing of unobserved exceptions.
'    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
'    <ThrowUnobservedTaskExceptions enabled="true"/>

Public Class Example
    Shared Sub Main()
        Task.Run(Sub() Throw New InvalidOperationException("test"))
        Do
            Thread.Sleep(100)
            GC.Collect()
            GC.WaitForPendingFinalizers()
        Loop
    End Sub
End Class

Consulte también