首页 > 解决方案 > 任务中的异常不会导致应用程序崩溃

问题描述

我是任务并行库的新手。我知道前台和后台线程中的异常以相同的方式工作,即它们传播到主线程并使应用程序崩溃(如果未处理)。但是,我在使用任务时看到了不同的行为。当任务中发生异常时,它只会结束其执行,而不会导致应用程序或其他任务崩溃。如果我没记错的话,任务使用后台线程,因此异常应该传播到主线程并像普通后台线程一样崩溃。

public static void Foo()
{
  throw new Exception("Blahh");
}
static void Main()
{
   Task t = Task.Run(()=>Foo());
   Thread.Sleep(500);
   Console.WriteLine("Main");
}

标签: c#task

解决方案


你应该Wait()你的Task. 如果任务有结果,则可以访问Result调用Wait(). 请注意,异常将在其集合AggregateException中,而原始异常将在其InnerExceptions集合中。

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static void Main()
        {
            Example1();
            Example2();
            Thread.Sleep(500);
            Console.WriteLine("Main");
        }

        public static void Example1()
        {
            try
            {
                Console.WriteLine("Example1");
                Task t = Task.Run(() => Foo());
                t.Wait();
            }
            catch (AggregateException e)
            {
                foreach (var ex in e.InnerExceptions)
                    Console.WriteLine(ex.Message);
            }
        }

        public static void Example2()
        {
            try
            {
                Console.WriteLine("Example2");
                Task<string> t = Task.Run(() => { Foo(); return "Task result"; });
                string result = t.Result;
                Console.Write(result);
            }
            catch (AggregateException e)
            {
                foreach (var ex in e.InnerExceptions)
                    Console.WriteLine(ex.Message);
            }
        }

        public static void Foo()
        {
            throw new Exception("Blahh Exception");
        }
    }
}

推荐阅读