<ThrowUnobservedTaskExceptions>, élément

Indique si les exceptions de tâches non gérées doivent arrêter un processus en cours d’exécution.

<configuration>
  <runtime>
    <ThrowUnobservedTaskExceptions>

Syntaxe

<ThrowUnobservedTaskExceptions  
   enabled="true|false"/>  

Attributs et éléments

Les sections suivantes décrivent des attributs, des éléments enfants et des éléments parents.

Attributs

Attribut Description
enabled Attribut requis.

Indique si les exceptions de tâches non gérées doivent arrêter le processus en cours d’exécution.

Attribut enabled

Valeur Description
false N’arrête pas le processus en cours d’exécution pour une exception de tâche non gérée. Il s’agit de la valeur par défaut.
true Arrête le processus en cours d’exécution pour une exception de tâche non gérée.

Éléments enfants

Aucune.

Éléments parents

Élément Description
configuration Élément racine de chaque fichier de configuration utilisé par le Common Language Runtime et les applications .NET Framework.
runtime Contient des informations sur les options d'initialisation du runtime.

Notes

Si aucune exception associée à une classe Task n’a été observée, qu’il n’existe aucune opération Wait, que le parent n’est pas attaché, et que la propriété Task.Exception n’a pas été lue, l’exception de tâche est considérée comme non observée.

Dans .NET Framework 4, par défaut, si une Task ayant une exception non observée fait l’objet d’un nettoyage de la mémoire, le finaliseur lève une exception et arrête le processus. L’arrêt du processus est déterminé par le minutage du nettoyage de la mémoire et de la finalisation.

Pour faciliter l’écriture de code asynchrone par les développeurs en fonction des tâches, .NET Framework 4.5 modifie ce comportement par défaut pour les exceptions non observées. Les exceptions non observées entraînent toujours la levée de l’événement UnobservedTaskException mais, par défaut, le processus ne s’arrête pas. Au lieu de cela, l’exception est ignorée une fois l’événement déclenché, qu’un gestionnaire d’événements observe l’exception ou non.

Dans .NET Framework 4.5, vous pouvez utiliser l’élément <ThrowUnobservedTaskExceptions> dans un fichier de configuration d’application pour activer le comportement de levée d’exception de .NET Framework 4.

Vous pouvez également spécifier le comportement d’exception de l’une des manières suivantes :

  • En définissant la variable d’environnement COMPlus_ThrowUnobservedTaskExceptions (set COMPlus_ThrowUnobservedTaskExceptions=1).

  • En définissant la valeur DWORD du Registre ThrowUnobservedTaskExceptions = 1 dans la clé HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework.

Exemple 1

L’exemple suivant montre comment activer la levée d’exceptions dans des tâches en utilisant un fichier de configuration d’application.

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

Exemple 2

L’exemple suivant montre comment une exception non observée est levée à partir d’une tâche. Pour fonctionner correctement, le code doit être exécuté en tant que programme publié.

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

Voir aussi