<ThrowUnobservedTaskExceptions>-Element

Gibt an, ob ein laufender Prozess durch Aufgabenausnahmefehler beendet werden soll.

<configuration>
  <runtime>
    <ThrowUnobservedTaskExceptions>

Syntax

<ThrowUnobservedTaskExceptions  
   enabled="true|false"/>  

Attribute und Elemente

In den folgenden Abschnitten werden Attribute sowie untergeordnete und übergeordnete Elemente beschrieben.

Attribute

attribute Beschreibung
enabled Erforderliches Attribut.

Gibt an, ob ein laufender Prozess durch unbehandelte Taskausnahmen beendet werden sollte.

Enabled-Attribut

Wert BESCHREIBUNG
false Beendet den ausgeführten Prozess bei einer unbehandelten Taskausnahme nicht. Dies ist die Standardoption.
true Beendet den ausgeführten Prozess bei einer unbehandelten Taskausnahme.

Untergeordnete Elemente

Keine

Übergeordnete Elemente

Element BESCHREIBUNG
configuration Das Stammelement in jeder von den Common Language Runtime- und .NET Framework-Anwendungen verwendeten Konfigurationsdatei.
runtime Enthält Informationen über Laufzeitinitialisierungsoptionen.

Bemerkungen

Wenn eine Ausnahme, die einem Task zugeordnet ist, nicht beobachtet wurde, gibt es keinen Wait-Vorgang, das übergeordnete Element wird nicht angefügt, und die Task.Exception-Eigenschaft wurde nicht gelesen. Die Taskausnahme wird also als nicht beobachtet angesehen.

Wenn im .NET Framework 4 standardmäßig für einen Task mit einer nicht beobachteten Ausnahme Garbage Collection ausgeführt wird, löst der Finalizer eine Ausnahme aus und beendet den Prozess. Die Beendigung des Prozesses wird durch das Timing der Garbage Collection und Finalisierung bestimmt.

Um Entwicklern das Schreiben von asynchronem Code auf Grundlage von Tasks zu erleichtern, ändert .NET Framework 4.5 dieses Standardverhalten für nicht beobachtete Ausnahmen. Nicht beobachtete Ausnahmen führen weiterhin dazu, dass das UnobservedTaskException-Ereignis ausgelöst wird, aber der Prozess wird standardmäßig nicht beendet. Stattdessen wird die Ausnahme ignoriert, nachdem das Ereignis ausgelöst wurde, unabhängig davon, ob ein Ereignishandler die Ausnahme beobachtet.

In .NET Framework 4.5 können Sie das <ThrowUnobservedTaskExceptions>-Element in einer Anwendungskonfigurationsdatei verwenden, um das .NET Framework 4-Verhalten des Auslösens einer Ausnahme zu aktivieren.

Sie können das Ausnahmeverhalten auch auf eine der folgenden Arten angeben:

  • Durch Festlegen der Umgebungsvariablen COMPlus_ThrowUnobservedTaskExceptions (set COMPlus_ThrowUnobservedTaskExceptions=1).

  • Durch Festlegen des DWORD-Registrierungswerts „ThrowUnobservedTaskExceptions = 1“ im Schlüssel „HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework“.

Beispiel 1

Das folgende Beispiel zeigt, wie Sie das Auslösen von Ausnahmen in Tasks mithilfe einer Anwendungskonfigurationsdatei aktivieren können.

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

Beispiel 2

Im folgenden Beispiel wird veranschaulicht, wie eine nicht beobachtete Ausnahme von einem Task ausgelöst wird. Der Code muss als freigegebenes Programm ausgeführt werden, damit er ordnungsgemäß funktioniert.

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

Siehe auch