<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

Zobacz też