<ThrowUnobservedTaskExceptions> 元素

指定未经处理的任务异常是否应终止正在运行的进程。

<配置>
   <运行时>
     <ThrowUnobservedTaskExceptions>

Syntax

<ThrowUnobservedTaskExceptions
   enabled="true|false"/>

特性和元素

下列各节描述了特性、子元素和父元素。

特性

Attribute Description
enabled 必需属性。

指定未经处理的任务异常是否应终止正在运行的进程。

enabled Attribute

价值 Description
false 不会终止未处理的任务异常的正在运行的进程。 这是默认情况。
true 终止未处理的任务异常的正在运行的进程。

子元素

没有。

父元素

元素 Description
configuration 公共语言运行时和 .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_ThrowUnobservedTaskExceptionsset COMPlus_ThrowUnobservedTaskExceptions=1)。

  • 通过在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework 键中设置注册表 DWORD 值 ThrowUnobservedTaskExceptions = 1。

示例 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

另请参阅