gpt4 book ai didi

c# - 使用TaskScheduler.UnobservedTaskException可以避免进程被杀死吗?

转载 作者:行者123 更新时间:2023-12-03 12:55:48 24 4
gpt4 key购买 nike

据我所知,如果任务中有未处理的异常,并且您不处理TaskScheduler.UnobservedTaskException,则它在稍后被收集/完成时将出错,并杀死您的进程。 (我要强调的是,它位于.net4.0中。我知道我们默认情况下可以抑制.net4.5中未处理的异常。)

这意味着,如果我使用TaskScheduler.UnobservedTaskException,该应用程序可以生存吗?我测试了以下代码:

static void Main(string[] args)
{
TaskScheduler.UnobservedTaskException += (o, ev) =>
{
Console.WriteLine(ev.Exception);
Console.WriteLine("---------");
};


for (int i = 0; i < 10; i++)
{
try
{
var t = Task.Factory.StartNew<int>(() =>
{ throw new Exception("xxxxxx"); return 1; },
CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
}
catch
{
Console.WriteLine("error");
}
}

while (true)
{
GC.Collect();
Thread.Sleep(1000);
}
Console.ReadKey();
}

此代码创建10个任务,每个任务都引发未处理的异常。
并且UnobservedTaskException触发一次。然后,应用程序被破坏。
(我尝试仅创建一个任务,在这种情况下,应用程序未损坏。)

因此,我的结论是,使用UnobservedTaskException事件没有用,仍然可以终止进程。我对吗??

最佳答案

您需要调用 UnobservedTaskExceptionEventArgs.SetObserved 使其成为观察到的异常:

TaskScheduler.UnobservedTaskException += (o, ev) =>
{
Console.WriteLine(ev.Exception);
Console.WriteLine("---------");
ev.SetObserved();
};

关于c# - 使用TaskScheduler.UnobservedTaskException可以避免进程被杀死吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25364427/

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