【问题标题】:Using TaskScheduler.UnobservedTaskException can avoid the process being killed?使用TaskScheduler.UnobservedTaskException 可以避免进程被杀死?
【发布时间】:2018-04-18 04:01:37
【问题描述】:

据我所知,如果任务中有未处理的异常,并且如果您不处理 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 事件没有用,进程仍然可以被杀死。我说的对吗?

【问题讨论】:

    标签: c# multithreading exception asynchronous task-parallel-library


    【解决方案1】:

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

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

    【讨论】:

    • 看来您需要在UnobservedTaskExceptionEventArgs - msdn.microsoft.com/en-us/library/… 上致电SetObserved
    • @DanielKelley 你是对的,没有注意到。修正了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多