次の方法で共有


<ThrowUnobservedTaskExceptions> 要素

未処理のタスク例外が実行中のプロセスを終了するかどうかを指定します。

<構成>
   <実行中>
     <ThrowUnobservedTaskExceptions>

構文

<ThrowUnobservedTaskExceptions
   enabled="true|false"/>

属性および要素

以降のセクションでは、属性、子要素、および親要素について説明します。

Attributes

特性 Description
enabled 必須の属性。

未処理のタスク例外が実行中のプロセスを終了するかどうかを指定します。

enabled 属性

価値 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) に設定します。

  • レジストリ DWORD 値 ThrowUnobservedTaskExceptions = 1 を HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework キーに設定します。

例 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

こちらも参照ください