_ = 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 @ 2025-01-14 18:28  凌枫玖  阅读(71)  评论(0)    收藏  举报