<Элемент ThrowUnobservedTaskExceptions>

Определяет, будут ли необработанные исключения задачи завершать выполняющийся процесс.

<настройка>
  <Среды выполнения>
    <ThrowUnobservedTaskExceptions>

Синтаксис

<ThrowUnobservedTaskExceptions  
   enabled="true|false"/>  

Атрибуты и элементы

В следующих разделах описаны атрибуты, дочерние и родительские элементы.

Атрибуты

Атрибут Описание
enabled Обязательный атрибут.

Указывает, должны ли необработанными исключениями задачи завершать выполняемый процесс.

Атрибут enabled

Значение Описание
false Не завершает выполняющийся процесс для исключения необработанных задач. Это значение по умолчанию.
true Завершает выполняемый процесс для исключения необработанных задач.

Дочерние элементы

Отсутствует.

Родительские элементы

Элемент Описание
configuration Корневой элемент в любом файле конфигурации, используемом средой CLR и приложениями .NET Framework.
runtime Содержит сведения о параметрах инициализации среды выполнения.

Комментарии

Если исключение, связанное Task с , не было обнаружено, операция отсутствует Wait , родительский объект не присоединен и Task.Exception свойство не было прочитано, исключение задачи считается незамеченным.

В платформа .NET Framework 4 по умолчанию, если Task объект с незамеченным исключением является сборщиком мусора, метод завершения создает исключение и завершает процесс. Завершение процесса определяется временем сборки и завершения сборки мусора.

Чтобы разработчикам было проще писать асинхронный код на основе задач, платформа .NET Framework 4.5 изменяет это поведение по умолчанию для ненаблюдаемых исключений. Ненаблюдаемые исключения по-прежнему вызывают UnobservedTaskException событие, но по умолчанию процесс не завершается. Вместо этого исключение игнорируется после возникновения события, независимо от того, наблюдает ли обработчик событий это исключение.

В платформа .NET Framework 4.5 можно использовать <элемент ThrowUnobservedTaskExceptions> в файле конфигурации приложения, чтобы включить поведение платформа .NET Framework 4, вызывающее исключение.

Поведение исключения можно также указать одним из следующих способов:

  • Задав переменную COMPlus_ThrowUnobservedTaskExceptions среды (set COMPlus_ThrowUnobservedTaskExceptions=1).

  • Задав значение DWORD реестра ThrowUnobservedTaskExceptions = 1 в разделе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework.

Пример 1

В следующем примере показано, как включить создание исключений в задачах с помощью файла конфигурации приложения.

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

Пример 2

В следующем примере показано, как из задачи создается ненаблюдаемое исключение. Для правильной работы код должен выполняться как выпущенная программа.

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

См. также раздел