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

C#异步控制台程序await异常处理与任务取消导致意外退出问题

问题根因
  • 核心错误是使用了async void定义CalculateSomeValue方法。async void是仅为事件处理程序设计的语法,常规异步逻辑严禁使用:它的调用方无法等待方法执行完成,控制台入口如果直接调用该方法,主进程不会等待异步逻辑执行完成就会退出;更关键的是async void抛出的异常无法被调用栈的catch捕获,会直接触发AppDomain级别的未处理异常,直接终止程序。
  • 你换成task.Wait()后方法变成同步方法,所有异常都会在当前调用线程抛出,被你写的try catch块正常捕获,所以不会崩溃。
修复方案
  • 把CalculateSomeValue的方法签名从public static async void CalculateSomeValue()改为public static async Task CalculateSomeValue()
  • 控制台入口Main方法改为支持异步的形式(C# 7.1及以上版本支持):
static async Task Main(string[] args)
{
    await CalculateSomeValue();
}
  • 补充输入合法性校验:将long.Parse(Console.ReadLine())替换为long.TryParse实现,避免用户输入非数字时直接抛出未处理异常。
  • 可选优化:将Task.Factory.StartNew替换为更安全的Task.Run调用,二者在当前场景功能等价,但Task.Run对异步委托的处理更符合常规预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:24:03