为什么我的程序在调用“OpenAsync()”时终止?

Pet*_*lde 0 c# mysql ado.net asynchronous mysql-connector

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

我通过 NuGet 包管理器按照此处所述安装了 MySqlConnector 。

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

这是我的程序:

    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();
    }      
Run Code Online (Sandbox Code Playgroud)

为什么会出现这种情况?我有什么遗漏的吗?也许与服务器端的配置有关?

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

nal*_*pir 7

您的问题是您没有等待 method 的执行doSomeStuff,因此当它到达第一个等待时,它将控制权返回给 main,并且由于 main 中没有什么可做的,所以它返回结束程序。

你这里有 2 个选择,

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

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

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

/sf/answers/3925494891/