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

如何捕获AggregateException?已返回Task却仍遇‘无法await void’错误

问题原因与解决方案

你遇到的「Cannot await void」错误,根本原因不是RunAsync的返回类型,而是你用await去等待了一个返回void的方法——Task.WaitAll是同步阻塞方法,返回值是void,自然不能被await。

为什么会混淆?

Copilot的提示跑偏了,因为它没精准定位到错误点——你代码里的await Task.WaitAll(...)才是问题核心,和RunAsync的返回类型完全无关。

怎么解决?

把Task.WaitAll换成异步版本的Task.WhenAll,它返回Task,可以正常用await等待,同时还能满足你观察AggregateException的需求:

修改后的RunAsync方法:

public async Task RunAsync()
{
    try
    {
        await Task.WhenAll(Method1Async(), Method2Async(), Method3Async());
    }
    catch (AggregateException ae)
    {
        foreach (var e in ae.InnerExceptions)
        {
            Console.WriteLine($"An aggregate error occurred: {e.Message}");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"A general error occurred: {ex.Message}");
    }
    Console.WriteLine("done");
}

额外说明:WaitAll vs WhenAll

  • Task.WaitAll:同步阻塞当前线程,直到所有任务完成,适合在非异步方法里用,但会阻塞线程。
  • Task.WhenAll:异步等待,不会阻塞当前线程,返回一个Task,适合在async方法里用,当所有任务完成后才会继续执行后续代码,同时会把所有任务抛出的异常打包成AggregateException。

这样修改后,你就能看到Method1Async和Method3Async抛出的异常被包装在AggregateException里,通过循环遍历InnerExceptions就能逐个处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:02:40