为什么TaskScheduler.UnobservedTaskException不会触发?

时间:2016-06-17 11:19:52

标签: c# debugging task-parallel-library task unhandled-exception

我在ContentResolver resolver = getActivity().getContentResolver(); 计算机上运行了一个定位.NET4的应用,其中包含以下.NET4.6.1

app.config

然后我尝试运行以下内容,希望看到消息<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的构建类型如何,都不会触发该事件。发生了什么事?

1 个答案:

答案 0 :(得分:1)

要实现预期的行为,您可以按照上述注释进行操作,并在使用版本

时删除GC.KeepAlive(task)

您可以在调用task = null;之前设置GC.Collect();以确保收集任务。 Here你可以找到另一个相关的答案,可能会增加一些细节。