Delen via


<Het element ThrowUnobservedTaskExceptions>

Hiermee geeft u op of niet-verwerkte taak-uitzonderingen een actief proces moeten beëindigen.

<Configuratie>
  <Runtime>
    <ThrowUnobservedTaskExceptions>

Syntax

<ThrowUnobservedTaskExceptions  
   enabled="true|false"/>  

Kenmerken en elementen

In de volgende secties worden kenmerken, onderliggende elementen en bovenliggende elementen beschreven.

Kenmerken

Kenmerk Beschrijving
enabled Vereist kenmerk.

Hiermee geeft u op of niet-verwerkte taak-uitzonderingen het actieve proces moeten beëindigen.

ingeschakeld kenmerk

Waarde Beschrijving
false Hiermee wordt het actieve proces voor een niet-verwerkte taakuitzondering niet beëindigd. Dit is de standaardinstelling.
true Hiermee wordt het actieve proces voor een niet-verwerkte taakuitzondering beëindigd.

Onderliggende elementen

Geen.

Bovenliggende elementen

Element Beschrijving
configuration Het hoofdelement in elk configuratiebestand dat wordt gebruikt door de common language runtime en .NET Framework toepassingen.
runtime Bevat informatie over opties voor runtime-initialisatie.

Opmerkingen

Als er geen uitzondering is waargenomen die aan een Task is gekoppeld, is er geen Wait bewerking, is het bovenliggende item niet gekoppeld en is de Task.Exception eigenschap niet gelezen. De taakuitzondering wordt als niet-waarneembaar beschouwd.

Als in de .NET Framework 4 standaard een Task met een niet-opgetreden uitzondering garbagecollection is, genereert de finalizer een uitzondering en beëindigt het proces. De beëindiging van het proces wordt bepaald door de timing van garbagecollection en voltooiing.

Om het voor ontwikkelaars gemakkelijker te maken om asynchrone code te schrijven op basis van taken, wijzigt de .NET Framework 4.5 dit standaardgedrag voor niet-opgetreden uitzonderingen. Niet-opgetreden uitzonderingen zorgen er nog steeds voor dat de UnobservedTaskException gebeurtenis wordt gegenereerd, maar het proces wordt standaard niet beëindigd. In plaats daarvan wordt de uitzondering genegeerd nadat de gebeurtenis is gegenereerd, ongeacht of een gebeurtenishandler de uitzondering waarneemt.

In .NET Framework 4.5 kunt u het <element ThrowUnobservedTaskExceptions> in een toepassingsconfiguratiebestand gebruiken om het .NET Framework 4-gedrag van het genereren van een uitzondering in te schakelen.

U kunt het uitzonderingsgedrag ook op een van de volgende manieren opgeven:

  • Door de omgevingsvariabele COMPlus_ThrowUnobservedTaskExceptions () in te stellen.set COMPlus_ThrowUnobservedTaskExceptions=1

  • Door de register-DWORD-waarde ThrowUnobservedTaskExceptions = 1 in te stellen in de sleutel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework.

Voorbeeld 1

In het volgende voorbeeld ziet u hoe u het genereren van uitzonderingen in taken inschakelt met behulp van een toepassingsconfiguratiebestand.

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

Voorbeeld 2

In het volgende voorbeeld ziet u hoe een niet-opgetreden uitzondering wordt gegenereerd vanuit een taak. De code moet worden uitgevoerd als een vrijgegeven programma om correct te werken.

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

Zie ook