Sdílet prostřednictvím


<ThrowUnobservedTaskExceptions> – element

Určuje, jestli mají neošetřené výjimky úkolů ukončit spuštěný proces.

<Konfigurace>
  <Runtime>
    <ThrowUnobservedTaskExceptions>

Syntax

<ThrowUnobservedTaskExceptions  
   enabled="true|false"/>  

Atributy a elementy

Následující části popisují atributy, podřízené prvky a nadřazené prvky.

Atributy

Atribut Popis
enabled Požadovaný atribut.

Určuje, jestli mají neošetřené výjimky úkolů ukončit spuštěný proces.

Atribut enabled

Hodnota Popis
false Neukončil spuštěný proces pro neošetřenou výjimku úlohy. Tato možnost je výchozí.
true Ukončí spuštěný proces pro neošetřenou výjimku úlohy.

Podřízené elementy

Žádné

Nadřazené elementy

Element Popis
configuration Kořenový prvek v každém konfiguračním souboru, který je používán modulem Common Language Runtime (CLR) a aplikacemi rozhraní .NET Framework.
runtime Obsahuje informace o možnostech inicializace modulu runtime.

Poznámky

Pokud nebyla zjištěna výjimka, která je přidružena k objektu Task , neexistuje žádná Wait operace, nadřazený objekt není připojen a Task.Exception vlastnost nebyla přečtena. Výjimka úkolu se považuje za nepozorovanou.

V rozhraní .NET Framework 4 ve výchozím nastavení, pokud Task je uvolněna výjimka, která má nepozorovanou výjimku, finalizátor vyvolá výjimku a ukončí proces. Ukončení procesu je určeno načasováním uvolňování paměti a finalizací.

Aby vývojáři mohli snadněji psát asynchronní kód založený na úlohách, změní rozhraní .NET Framework 4.5 toto výchozí chování pro nepozorované výjimky. Nepozorované výjimky stále způsobují UnobservedTaskException vyvolání události, ale ve výchozím nastavení se proces neukončil. Místo toho je výjimka ignorována po vyvolání události bez ohledu na to, zda obslužná rutina události pozoruje výjimku.

V rozhraní .NET Framework 4.5 můžete použít <throwUnobservedTaskExceptions> element v konfiguračním souboru aplikace k povolení chování rozhraní .NET Framework 4 vyvolání výjimky.

Chování výjimky můžete také určit jedním z následujících způsobů:

  • Nastavením proměnné COMPlus_ThrowUnobservedTaskExceptions prostředí (set COMPlus_ThrowUnobservedTaskExceptions=1).

  • Nastavením hodnoty DWORD registru ThrowUnobservedTaskExceptions = 1 v klíči HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework.

Příklad 1

Následující příklad ukazuje, jak povolit vyvolání výjimek v úlohách pomocí konfiguračního souboru aplikace.

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

Příklad 2

Následující příklad ukazuje, jak je vyvolána nepozorovaná výjimka z úkolu. Aby kód fungoval správně, musí být spuštěn jako uvolněný 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

Viz také