使用TaskScheduler.UnobservedTaskException可以避免进程被终止

本文关键字:终止 进程 可以避免 TaskScheduler UnobservedTaskException 使用 | 更新日期: 2023-09-27 18:18:34

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

这意味着如果我使用TaskScheduler。unservedtaskexception,应用程序能否存活?我测试了下面的代码:

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事件是没有用的,进程仍然可以被杀死。我说的对吗?

使用TaskScheduler.UnobservedTaskException可以避免进程被终止

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

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