<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