<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