<ThrowUnobservedTaskExceptions> 元素
指定未處理的工作例外狀況是否應終止執行中的處理序。
<設定>
<執行階段>
<ThrowUnobservedTaskExceptions>
Syntax
<ThrowUnobservedTaskExceptions
enabled="true|false"/>
屬性和項目
下列章節說明屬性、子元素和父元素。
屬性
屬性 | 描述 |
---|---|
enabled |
必要屬性。 指定未處理的工作例外狀況是否應終止執行中的進程。 |
啟用屬性
值 | 描述 |
---|---|
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