<Elemento ThrowUnobservedTaskExceptions>

Especifica se as exceções de tarefas sem tratamento devem encerrar um processo em execução.

<configuration>
  <runtime>
    <ThrowUnobservedTaskExceptions>

Syntax

<ThrowUnobservedTaskExceptions  
   enabled="true|false"/>  

Atributos e elementos

As seções a seguir descrevem atributos, elementos filho e elementos pai.

Atributos

Atributo Descrição
enabled Atributo obrigatório.

Especifica se as exceções de tarefas sem tratamento devem encerrar o processo em execução.

Atributo habilitado

Valor Descrição
false Não encerra o processo em execução para uma exceção de tarefa sem tratamento. Esse é o padrão.
true Encerra o processo em execução para uma exceção de tarefa sem tratamento.

Elementos filho

Nenhum.

Elementos pai

Elemento Descrição
configuration O elemento raiz em cada arquivo de configuração usado pelos aplicativos do Common Language Runtime e .NET Framework.
runtime Contém informações sobre opções de inicialização do runtime.

Comentários

Se uma exceção associada a uma Task não tiver sido observada, não haverá operação Wait, o pai não será anexado e a propriedade Task.Exception não foi lida, a exceção da tarefa será considerada não observada.

No .NET Framework 4, por padrão, se uma exceção Task não observada for capturada pela coleta de lixo, o finalizador vai gerar uma exceção e encerrar o processo. O encerramento do processo é determinado pelo tempo da coleta de lixo e a finalização.

Para facilitar a gravação de código assíncrono com base em tarefas, o .NET Framework 4.5 altera esse comportamento padrão para exceções não observadas. Exceções não observadas ainda fazem com que o evento UnobservedTaskException seja acionado, mas, por padrão, o processo não é encerrado. Em vez disso, a exceção é ignorada depois que o evento é acionado, independentemente de um manipulador de eventos observar a exceção.

No .NET Framework 4.5, você pode usar o elemento <ThrowUnobservedTaskExceptions> em um arquivo de configuração de aplicativo para habilitar o comportamento .NET Framework 4 de gerar uma exceção.

Você também pode especificar o comportamento de exceção de uma das seguintes maneiras:

  • Definindo a variável de ambiente COMPlus_ThrowUnobservedTaskExceptions (set COMPlus_ThrowUnobservedTaskExceptions=1).

  • Definindo o valor de DWORD no Registro ThrowUnobservedTaskExceptions = 1 na chave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework.

Exemplo 1

O exemplo a seguir mostra como habilitar o lançamento de exceções em tarefas usando um arquivo de configuração de aplicativo.

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

Exemplo 2

O exemplo a seguir demonstra como uma exceção não observada é gerada com base em uma tarefa. O código deve ser executado como um programa lançado para funcionar corretamente.

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

Confira também