Partilhar via


<ThrowUnobservedTaskExceptions> Elemento

Especifica se exceções de tarefa não tratadas devem terminar um processo em execução.

<configuração>
   <tempo de execução>
     <ThrowUnobservedTaskExceptions>

Sintaxe

<ThrowUnobservedTaskExceptions
   enabled="true|false"/>

Atributos e Elementos

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

Attributes

Attribute Description
enabled Atributo obrigatório.

Especifica se exceções de tarefas não tratadas devem terminar o processo em execução.

Atributo ativado

Valor Description
false Não termina o processo em execução por uma exceção de tarefa não tratada. Este é o padrão.
true Termina o processo em execução por uma exceção de tarefa não tratada.

Elementos Subordinados

Nenhum.

Elementos Principais

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

Observações

Se uma exceção associada a Task não tiver sido observada, não Wait houver operação, o pai não estiver associado e a Task.Exception propriedade não for lida, a exceção de tarefa é considerada não observada.

No .NET Framework 4, por defeito, se um Task que tem uma exceção não observada for recolhido pelo lixo, o finalizador lança uma exceção e termina o processo. A terminação do processo é determinada pelo momento da recolha e finalização do lixo.

Para facilitar aos programadores a escrita de código assíncrono baseado em tarefas, o .NET Framework 4.5 altera este comportamento padrão para exceções não observadas. Exceções não observadas continuam a fazer com que o UnobservedTaskException evento seja levantado, mas por defeito, o processo não termina. Em vez disso, a exceção é ignorada após o evento ser levantado, independentemente de um handler de eventos observar ou não a exceção.

No .NET Framework 4.5, pode usar o <ThrowUnobservedTaskExceptions> elemento num ficheiro de configuração de aplicação para ativar o comportamento do .NET Framework 4 ao lançar uma exceção.

Também pode especificar o comportamento de exceção de uma das seguintes formas:

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

  • Ao definir o valor DWORD do registo ThrowUnobservedTaskExceptions = 1 na tecla HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework.

Exemplo 1

O exemplo seguinte mostra como ativar o lançamento de exceções em tarefas usando um ficheiro de configuração de aplicação.

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

Exemplo 2

O exemplo seguinte demonstra como uma exceção não observada é lançada de 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

Consulte também