c# - 为什么我的程序在调用 "OpenAsync()"时终止?

标签 c# mysql asynchronous ado.net mysql-connector

我正在尝试使用 MySqlConnector 连接到在 MariaDB 上运行的数据库.但是,如果我从指定网站执行基本代码片段,我的程序会在异步打开数据库连接时立即终止(通过调试发现)。通常,控制台窗口只是在屏幕上弹出,然后立即再次关闭。

我按照描述安装了 MySqlConnector here通过 NuGet 包管理器。

异步方法的同步版本没有任何问题,我收到了预期的数据。与另一个数据库的连接也不起作用。

这是我的程序:

    static void Main(string[] args)
    {                    
        doSomeStuff();            
    }

    public static async void doSomeStuff()
    {
        var connString = "Server=localhost;User ID=root;Password=password;Database=mysql";

        using (var conn = new MySqlConnection(connString))
        {
            await conn.OpenAsync();                

            using (var cmd = new MySqlCommand("SELECT host FROM mysql.user", conn))
            using (var reader = await cmd.ExecuteReaderAsync())
                while (await reader.ReadAsync())
                    Console.WriteLine(reader.GetString(0));
        }


        Console.WriteLine("Finished!");
        Console.ReadKey();
    }      

为什么会这样?有什么我想念的吗?也许与服务器端的配置有关?

目标框架:.NET Framework 4.7.1 MySqlConnector 版本:0.53.0 MariaDB版本:10.3.14

最佳答案

你的问题是你没有等待doSomeStuff方法的执行,所以当它到达第一个await时,它会将控制权返回给main,并且因为没有什么可以留给在 main 中执行它返回结束程序。

这里有 2 个选项,

  1. 是运行等待 Task.delay(-1) 的主异步,首先执行您拥有的方法,因为您正在等待一个永远不会结束的任务,您将完成工作。

  2. 像这样调用您的方法 doSomeStuff().GetAwaiter().GetResult() 。这将等待该方法执行它需要执行的操作,然后返回到主线程。为了实现这一点,您应该为异步任务而不是异步无效更改方法的签名。 (如果使用旧的 c# 版本,最好的选择)

  3. MickyD 的选项 3(如果是 c# 7.1 或更高版本,则为最佳选项)

https://stackoverflow.com/a/56078498/10513564

关于c# - 为什么我的程序在调用 "OpenAsync()"时终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56077381/

相关文章:

c# - 使用反射将 XML 转换为对象

c# - .Net Core 上的计划任务

javascript - 如何使用chart.js将来自mysql的数据显示为饼图?

javascript - 我可以使用内置的 fetch() 减少这个异步代码吗?

javascript - 如何同步执行socket.io端点

c# - 多个异步方法,最好使用具有不同返回类型的 WhenAll

c# - 多行插入 Azure Mobile Services Offline,与后端同步

c# - 调用存储在字符串变量中的函数

php - laravel 5 从未找到的数据库类中获取数据

mysql - 以月份中的天数为列的 SQL 查询