繁体   English   中英

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

[英]Using TaskScheduler.UnobservedTaskException can avoid the process being killed?

据我所知,如果任务中有未处理的异常,并且您不处理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();
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM