我正在尝试使用 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 个选项,
是运行等待 Task.delay(-1) 的主异步,首先执行您拥有的方法,因为您正在等待一个永远不会结束的任务,您将完成工作。
像这样调用您的方法 doSomeStuff().GetAwaiter().GetResult() 。这将等待该方法执行它需要执行的操作,然后返回到主线程。为了实现这一点,您应该为异步任务而不是异步无效更改方法的签名。 (如果使用旧的 c# 版本,最好的选择)
MickyD 的选项 3(如果是 c# 7.1 或更高版本,则为最佳选项)
关于c# - 为什么我的程序在调用 "OpenAsync()"时终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56077381/