主线程捕获子线程异常

正常情况下使用多线程出现异常时,都是按照单个任务去处理异常,在线程间不需要通信的情况下,任务之间互不影响,主线程也不必知道子线程是否发成异常。
那么只需要处理子线程异常即可

Task.Run(() =>
{
    try
    {
        throw new Exception("error message");
    }
    catch (Exception ex)
    {
        Console.WriteLine("出现异常,记录日志,业务回滚等等...");
    }
});

但是在某些复杂业务中,多个线程在执行过程中如果出现异常需要反馈给主线程,所以需要在子线程出现异常时通知主线程。

实现方式:

  1. 使用Task.WaitAll,使主线程阻塞。
try
{
    List<Task> tasks = new List<Task>();
    tasks.Add(Task.Run(() => {
        throw new Exception("error message");
    }));
    Task.WaitAll(tasks.ToArray());
}
catch (AggregateException ex)
{
    foreach (var except in ex.InnerExceptions)
    {
        Console.WriteLine(except.Message);
    }
}

执行结果:
在这里插入图片描述
2. 使用非阻塞Task.Factory.ContinueWhenAll

List<Task> tasks = new List<Task>();
tasks.Add(Task.Run(() => {
    throw new Exception("error message");
}));
//Task.WaitAll(tasks.ToArray());
Task.Factory.ContinueWhenAll(tasks.ToArray(),
    t =>
    {
        foreach (var task in t)
        {
            if (task.IsFaulted)
            {
                AggregateException aggEx = task.Exception;
                Console.WriteLine(aggEx.Message);
            }
        }
    });

打印结果:

One or more errors occurred. (error message)

在这里插入图片描述

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 20:00:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 20:00:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 20:00:03       82 阅读
  4. Python语言-面向对象

    2024-04-22 20:00:03       91 阅读

热门阅读

  1. 达梦数据库的DMRMAN工具介绍

    2024-04-22 20:00:03       36 阅读
  2. ChatGPT写作术:高效撰写顶级论文

    2024-04-22 20:00:03       33 阅读
  3. linux部署dagu和benthos作为调度平台+数据处理框架

    2024-04-22 20:00:03       43 阅读
  4. 检查服务器机器是不是被暴力破解

    2024-04-22 20:00:03       45 阅读
  5. 【格式化日期】在Vue3中如何格式化日期

    2024-04-22 20:00:03       34 阅读
  6. random模块

    2024-04-22 20:00:03       37 阅读
  7. day6-arm

    2024-04-22 20:00:03       38 阅读