<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

另請參閱