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

MySQL Net Connector v9.1连接失败时调用异步函数致程序崩溃

MySQL Connector/NET异步连接超时导致未捕获异常崩溃的解决方案

问题背景

在WPF应用中使用MySQL Connector/NET异步连接数据库时,若服务器无法连接,OpenAsync()抛出的AggregateException无法被try/catch捕获,直接导致程序崩溃;而同步Open()方法则能正常捕获MySqlException(超时错误),程序可继续运行。

环境配置:

  • Windows 10
  • .NET Framework 4.7.2
  • MySQL Connector/NET 9.1/8.4/8.0.33(均存在此问题)
  • 仅8.0.31版本(伪异步实现)可正常捕获异常,但并非真正异步。

问题原因

官方MySQL Connector/NET的真正异步实现中,超时逻辑依赖CancellationTokenSource的定时器回调,该回调运行在ThreadPool线程上,抛出的异常未被await上下文捕获,直接冒泡到AppDomain层面引发程序崩溃。

解决方案

1. 显式处理AggregateException并添加兜底异常捕获

在代码中直接捕获AggregateException,拆解内部的MySqlException;同时注册AppDomain未处理异常事件作为兜底,避免程序直接崩溃:

static async Task Main(string[] args)
{
    // 注册AppDomain未处理异常兜底
    AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
    {
        Console.WriteLine($"未处理异常: {e.ExceptionObject}");
    };

    using (MySqlConnection conn = new MySqlConnection(connString))
    {
        try
        {
            await conn.OpenAsync();
            Console.WriteLine("连接成功!");
        }
        catch (AggregateException ex)
        {
            // 提取内部的MySQL超时异常
            if (ex.InnerException is MySqlException mysqlEx)
            {
                Console.WriteLine($"连接失败: {mysqlEx.Message}");
            }
            else
            {
                Console.WriteLine($"连接失败: {ex.Message}");
            }
        }
        catch (MySqlException ex)
        {
            Console.WriteLine($"连接失败: {ex.Message}");
        }
    }

    Console.ReadLine();
}

2. 调整连接字符串超时参数

缩短连接超时时间,减少超时异常触发的概率,或明确配置超时参数:

Server=your_server_address;Database=your_db_name;Uid=username;Pwd=password;Connection Timeout=5;

3. 替换为第三方MySqlConnector库

官方Connector/NET的异步实现存在稳定性问题,推荐使用第三方库MySqlConnector(完全兼容ADO.NET,异步实现更可靠):

  • 安装NuGet包:Install-Package MySqlConnector
  • 替换命名空间:
    using MySqlConnector; // 替代原MySql.Data.MySqlClient
    
    使用该库后,异步连接超时的异常可被try/catch正常捕获,无需额外处理。

补充说明

8.0.31版本能正常捕获异常,是因为该版本的异步方法是同步代码的包装(伪异步),异常在调用线程抛出,因此能被上下文的try/catch捕获,但无法发挥异步操作的性能优势。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:40:58