抛出异常(没有等待,没有访问异常)的任务是否会导致程序崩溃?

时间:2016-01-25 23:15:06

标签: c# .net exception task-parallel-library

在框架4.0下运行时,以下程序是否真的崩溃了?当它在4.5或更高版本下运行时,它不会与this MSDN blog post一致,虽然此relevant article似乎没有更新,仍然会说代码应该抛出(&#34) ;根据.NET异常策略")升级异常。

我问的原因是,在我的真实世界应用程序中,我有许多任务,可能会抛出异常以表示失败并且实际上从未等待过。我们仍然部署在Windows XP机器上(不要问)which support only Framework 4.0.我们还没有收到他们的错误报告,但由于问题与垃圾收集有关,例外可能只会在程序运行时冒泡很长一段时间或者需要更多来自其他地方的记忆。

(为了完整性,设计是任务日志并在本地清理,然后重新抛出以便失败,这可以通过延续来识别。)同样的原因激发了4.0之间的行为变化这个框架的4.5版本,由Stephen Toub在blog article mentioned above中讨论过,我很难等待(或访问Exception属性)所有可能抛出的任务。 (我不禁把它想象成一个神学之谜 - 如果有一个魔鬼声称所有罪人都死了,谁最终会声称​​他的灵魂?"谁开始了第一个节目?")

using System;
using System.Threading.Tasks;

namespace TaskExceptions
{
    class TaskWithDtor: Task
    {
        public TaskWithDtor(Action a) : base(a) { }

        ~TaskWithDtor() 
        { 
            Console.WriteLine("~TaskWithDtor executing"); 
            // now calls Task's destructor implicitly
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var twd = new TaskWithDtor(() => 
            {
                Console.WriteLine("Task executing, now going to throw ...");
                throw new Exception("Thrown by task");
            });

            twd.RunSynchronously(); // make sure it's done ...

            // ... but do no wait
        }
    }
}

在VS 2013中运行时的示例输出,针对Framework 4.6.1编译(并可能运行):

Task executing, now going to throw ...
~TaskWithDtor executing

编辑:正如i3arnon在评论中提供的链接所示,我包含了元素

<runtime> 
      <ThrowUnobservedTaskExceptions enabled="true"/> 
</runtime> 

在我的应用程序的app.config中,但它没有改变行为(这是程序在4.5或更高版本下运行时不会抛出异常 - 我实际安装了Framework 4.6版。 1)。我错过了什么?

0 个答案:

没有答案