指定未经处理的任务异常是否应终止正在运行的进程。
<配置>
<运行时>
<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_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