<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

関連項目