Бөлісу құралы:


<ThrowUnobservedTaskExceptions> Элемент

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

<configuration>
  <runtime>
    <ThrowUnobservedTaskExceptions>

Синтаксис

<ThrowUnobservedTaskExceptions
   enabled="true|false"/>

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

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

Attributes

Свойство Description
enabled Обязательный атрибут.

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

Атрибут с поддержкой

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

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

Нет.

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

Элемент Description
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

См. также