<ThrowUnobservedTaskExceptions> , element
Określa, czy nieobsługiwane wyjątki zadań powinny zakończyć uruchomiony proces.
<konfiguracja>
<Środowiska wykonawczego>
<ThrowUnobservedTaskExceptions>
Składnia
<ThrowUnobservedTaskExceptions
enabled="true|false"/>
Atrybuty i elementy
W poniższych sekcjach opisano atrybuty, elementy podrzędne i elementy nadrzędne.
Atrybuty
Atrybut | Opis |
---|---|
enabled |
Atrybut wymagany. Określa, czy nieobsługiwane wyjątki zadań powinny zakończyć uruchomiony proces. |
Atrybut włączony
Wartość | Opis |
---|---|
false |
Nie kończy uruchomionego procesu dla nieobsługiwanego wyjątku zadania. Jest to opcja domyślna. |
true |
Kończy uruchomiony proces dla nieobsługiwanego wyjątku zadania. |
Elementy podrzędne
Brak.
Elementy nadrzędne
Element | Opis |
---|---|
configuration |
Element główny w każdym pliku konfiguracji używanym przez środowisko uruchomieniowe języka wspólnego i aplikacje programu .NET Framework. |
runtime |
Zawiera informacje dotyczące opcji inicjowania środowiska uruchomieniowego. |
Uwagi
Jeśli nie zaobserwowano wyjątku skojarzonego z elementem Task , nie Wait ma operacji, obiekt nadrzędny nie jest dołączony, a Task.Exception właściwość nie odczytała wyjątku zadania jest uznawana za nieobserwowaną.
W .NET Framework 4, domyślnie, jeśli elementTask, który ma nieobserwowany wyjątek, jest odśmiecany, finalizator zgłasza wyjątek i kończy proces. Zakończenie procesu zależy od czasu odzyskiwania pamięci i finalizacji.
Aby ułatwić deweloperom pisanie kodu asynchronicznego na podstawie zadań, .NET Framework 4.5 zmienia to domyślne zachowanie w przypadku nieobserwowanych wyjątków. Nieobserwowane wyjątki nadal powodują UnobservedTaskException wywoływanie zdarzenia, ale domyślnie proces nie kończy się. Zamiast tego wyjątek jest ignorowany po wystąpieniu zdarzenia, niezależnie od tego, czy program obsługi zdarzeń obserwuje wyjątek.
W .NET Framework 4.5 można użyć <elementu ThrowUnobservedTaskExceptions> w pliku konfiguracji aplikacji, aby umożliwić .NET Framework 4 zgłaszania wyjątku.
Zachowanie wyjątku można również określić w jeden z następujących sposobów:
Ustawiając zmienną środowiskową
COMPlus_ThrowUnobservedTaskExceptions
(set COMPlus_ThrowUnobservedTaskExceptions=1
).Ustawiając wartość DWORD rejestru ThrowUnobservedTaskExceptions = 1 w kluczu HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework.
Przykład 1
W poniższym przykładzie pokazano, jak włączyć zgłaszanie wyjątków w zadaniach przy użyciu pliku konfiguracji aplikacji.
<configuration>
<runtime>
<ThrowUnobservedTaskExceptions enabled="true"/>
</runtime>
</configuration>
Przykład 2
W poniższym przykładzie pokazano, jak jest zgłaszany nieobserwowany wyjątek z zadania. Aby kod działał poprawnie, należy uruchomić go jako wydany program.
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