You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MVC中使用丢弃符_处理异步任务时抛出未观察异常如何解决

问题根源

这个异常是.NET Framework 特有的任务异常机制导致的:当处于Faulted(故障)状态的Task被GC回收时,如果没有任何代码主动观察过它的异常(包括await该Task、访问其Exception属性、通过ContinueWith处理异常),运行时会在终结器线程抛出未观察任务异常,直接触发进程崩溃。

你使用丢弃符_仅表示你不需要该Task的返回值,不会让运行时自动跳过异常检查逻辑。你之前await时无异常,是因为await操作会自动观察Task状态,而AddNoteAsync内部已经捕获了业务异常,Task最终为正常完成状态,不会触发异常检查。

解决方案

方案1:给Fire-and-Forget任务加异常观察延续(推荐)

写一个通用的扩展方法统一处理火并任务的异常,既避免未观察异常,也支持异常日志记录:

public static class TaskExtensions
{
    public static void FireAndForget(this Task task, Action<Exception> errorHandler = null)
    {
        task.ContinueWith(t =>
        {
            if (t.IsFaulted)
            {
                // 主动访问Exception属性,标记异常已被观察
                var ex = t.Exception;
                errorHandler?.Invoke(ex);
                // 可在此处加全局默认日志逻辑
            }
        }, TaskContinuationOptions.ExecuteSynchronously);
    }
}

使用方式:

[HttpGet]
[ActionName("testme")]
public bool TestMe()
{
    AddNoteAsync("Test").FireAndForget(ex => 
    {
        // 此处可添加自定义日志,比如记录添加笔记失败的异常
    });
    return true;
}

方案2:修改AddNoteAsync确保永远不会返回故障Task

在AddNoteAsync内部做全链路异常兜底,确保哪怕出现意料之外的异常,也不会让返回的Task进入Faulted状态:

public static async Task AddNoteAsync(string note)
{
    try
    {  
        var client = new Client();              
        await client.Note.CreateAsync(note);    
    }
    catch (Exception)
    {               
        // 所有异常全部捕获,不要往外抛
    }
}

注意:如果采用这个方案,一定要确认AddNoteAsync内部所有可能抛出异常的逻辑都被try-catch包裹,包括对象构造、参数校验等同步执行逻辑

方案3:全局处理未观察任务异常(不推荐)

如果项目中有大量火并任务不想逐个修改,可以在Global.asax.cs的Application_Start方法中全局注册事件处理:

protected void Application_Start()
{
    TaskScheduler.UnobservedTaskException += (sender, e) =>
    {
        // 标记所有未观察异常已处理,避免进程崩溃
        e.SetObserved();
        // 此处可加全局日志,避免隐藏业务问题
    };

    // 原有启动逻辑,比如AreaRegistration、RouteConfig注册等
}

该方案会全局吞掉所有未观察的任务异常,容易隐藏其他代码的bug,仅建议作为临时兜底方案使用。


内容的提问来源于stack exchange,提问作者dkotsopo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:45:04