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