gpt4 book ai didi

c# - 永远不会触发 TaskScheduler.UnobservedTaskException 事件处理程序

转载 作者:IT王子 更新时间:2023-10-29 04:07:53 26 4
gpt4 key购买 nike

我正在阅读一本关于 C# 任务并行库的书,并有以下示例,但从未触发 TaskScheduler.UnobservedTaskException 处理程序。任何人都可以告诉我原因吗?

TaskScheduler.UnobservedTaskException += (object sender, UnobservedTaskExceptionEventArgs eventArgs) =>
{
eventArgs.SetObserved();
((AggregateException)eventArgs.Exception).Handle(ex =>
{
Console.WriteLine("Exception type: {0}", ex.GetType());
return true;
});
};

Task task1 = new Task(() =>
{
throw new ArgumentNullException();
});

Task task2 = new Task(() => {
throw new ArgumentOutOfRangeException();
});

task1.Start();
task2.Start();

while (!task1.IsCompleted || !task2.IsCompleted)
{
Thread.Sleep( 5000 );
}

Console.WriteLine("done");
Console.ReadLine();

最佳答案

不幸的是,该示例永远不会向您展示您的代码。 UnobservedTaskException 仅当任务被 GC 收集且未观察到异常时才会发生 - 只要您持有对 task1task2 的引用,GC 将永远不会收集,您也永远不会看到您的异常处理程序。

为了查看 UnobservedTaskException 的行为,我会尝试以下(人为的示例):

public static void Main()
{
TaskScheduler.UnobservedTaskException += (object sender, UnobservedTaskExceptionEventArgs eventArgs) =>
{
eventArgs.SetObserved();
((AggregateException)eventArgs.Exception).Handle(ex =>
{
Console.WriteLine("Exception type: {0}", ex.GetType());
return true;
});
};

Task.Factory.StartNew(() =>
{
throw new ArgumentNullException();
});

Task.Factory.StartNew(() =>
{
throw new ArgumentOutOfRangeException();
});


Thread.Sleep(100);
GC.Collect();
GC.WaitForPendingFinalizers();

Console.WriteLine("Done");
Console.ReadKey();
}

这将显示您的消息。第一个 Thread.Sleep(100) 调用为任务抛出提供了足够的时间。收集和等待会强制执行 GC 收集,这将触发您的事件处理程序 2 次。

关于c# - 永远不会触发 TaskScheduler.UnobservedTaskException 事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3284137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com