<ThrowUnobservedTaskExceptions> 元素

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

configuration
  runtime
    <ThrowUnobservedTaskExceptions>

语法

<ThrowUnobservedTaskExceptions  
   enabled="true|false"/>  

特性和元素

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

特性

属性 描述
enabled 必需的特性。

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

enabled 特性

说明
false 不终止正在运行的进程的未处理任务异常。 这是默认值。
true 终止正在运行的进程的未处理任务异常。

子元素

无。

父元素

元素 说明
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_ThrowUnobservedTaskExceptions (set 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

请参阅