0

私は、次のapp.config.NET4.6.1マシン上で実行されている.NET4を対象にアプリを持っている:なぜTaskScheduler.UnobservedTaskExceptionがトリガーしないのですか?

<configuration> 
    <runtime> 
    <ThrowUnobservedTaskExceptions enabled="true"/> 
    </runtime> 
</configuration> 

私は、メッセージBoom!: ....見ることを期待し、次を実行しよう:

static void Main(string[] args) 
{ 
    SetupUnobservedTaskExceptionHandling(); 

    var task = Task.Factory.StartNew(() => 
     { 
      Console.WriteLine("Task started"); 
      var innerException = new InvalidOperationException("No way!"); 
      throw new ApplicationException("Ooops!", innerException); 
     }); 

    Thread.Sleep(1000); 

    // The task should be in faulted state before collection for the exception event to bubble up 
    Console.WriteLine($"Task Status: {task.Status}"); 

    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 

    GC.KeepAlive(task); 

    Console.ReadLine(); 
} 

[HandleProcessCorruptedStateExceptions] 
public static void SetupUnobservedTaskExceptionHandling() 
{ 
    Console.WriteLine("Setting up unobserved task exception handling..."); 
    TaskScheduler.UnobservedTaskException += (sender, args) => 
    { 
     Console.WriteLine("Boooom!: {0}", args); 
    }; 
    Console.WriteLine("Set up unobserved task exception handling."); 
} 

をしかし、イベントがありますビルドタイプDebugまたはReleaseに関係なく、トリガーされません。何が起こっている?期待される動作をachievetheする

+1

GC.KeepAlive(タスク);を削除してください。 – PetSerAl

+1

Debugはデバッグ可能性のためにローカル変数のライフタイムを拡張するため、リリースも使用する必要があります。 – usr

答えて

1

あなたはリリース

または

を使用しているときは、そのタスクが収集されていることを確認するためにGC.Collect();を呼び出す前にtask = null;を設定することができます上記のコメントをたどるとGC.KeepAlive(task)を削除することができます。 Hereもう少し詳細を追加する別の関連する回答が見つかります。

関連する問題