_ = Task.Run(async () =>... 小心 fire-and-forget 异步任务的异常捕获

复制代码
_ = Task.Run(async() =>
{
    try
    {
        throw new NotImplementException();
        await Task.Delay(1);
    }
    catch(Exception ex)
    {
        Debug.WriteLine(ex);
    }
}
复制代码

fire and forget 的异步后台任务,用 try-catch 包裹起来。

 

Task.Run 会把我们的任务放到线程池上去执行。

而异步 async await 关键字为我们创造了一个状态机,并把 exception 包装成了一个 Task Exception。

上面的代码,如果没有 await Task.Run,这个包装后的任务异常,就不会返回到调用线程,导致调试器也捕捉不到该错误。

catch 后至少能快速在 Output 窗口定位问题。

posted @   凌枫玖  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示