c# - 任务中的异常不会导致应用程序崩溃
问题描述
我是任务并行库的新手。我知道前台和后台线程中的异常以相同的方式工作,即它们传播到主线程并使应用程序崩溃(如果未处理)。但是,我在使用任务时看到了不同的行为。当任务中发生异常时,它只会结束其执行,而不会导致应用程序或其他任务崩溃。如果我没记错的话,任务使用后台线程,因此异常应该传播到主线程并像普通后台线程一样崩溃。
public static void Foo()
{
throw new Exception("Blahh");
}
static void Main()
{
Task t = Task.Run(()=>Foo());
Thread.Sleep(500);
Console.WriteLine("Main");
}
解决方案
你应该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");
}
}
}
推荐阅读
- c# - 将潜在的大文件分块传递给 Web API
- python - 如何使矩形“冲刺”
- python - 使用 influxdb python 客户端从远程主机查询数据
- google-chrome - 检查 chrome 中的禁用元素?
- jenkins - Jenkins - 将 env var 设置为命令的输出?
- r - 从R中的大栅格创建多边形
- aws-fargate - ResourceInitializationError:无法验证记录器参数::信号:已杀死
- angular - 我可以使用应用程序模块中的惰性模块提供的服务吗
- angular - ngOnInit 变量不会出现在模板端
- python - 优化组合算法的复杂度