尝试使用task.run()在mysql中运行insert query时,抛出以下异常:“无法连接到任何指定的mysql主机”

os8fio9y  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(272)

代码如下:

static void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) //Event Handler
{
   Time timeToSend = JsonConvert.DeserializeObject<Time>(Encoding.UTF8.GetString(e.Message));

   Task.Run(async () => await SendToMySql(timeToSend));            
}

在sendtomysql方法中,它基本上是一个insert,如下所示:

private static async Task SendToMySql(Time timeToSend)
{
        try
        {
            var connection = new MySqlConnection(string.Format(configuration["MySql:ConnectionString"], configuration["MySql:DataBaseName"]));
            await connection.OpenAsync();
            string query = "insert into resource_log (resource_value_log, creation_date) values ('" + timeToSend.Message + "',STR_TO_DATE( '" + DateTime.Now + "', '%d/%m/%Y %H:%i:%s'))";
            var cmd = new MySqlCommand(query, connection);
            await cmd.ExecuteReaderAsync();
            await connection.CloseAsync();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message.ToString());
        }
 }

我使用task.run()调用了这个方法,因为我希望它在必要时也能异步运行。但它抛出以下异常:
“无法连接到任何指定的mysql主机。”
以下是内部例外:
超时已过期。操作完成前已过超时时间,或者服务器没有响应。
一些数据实际上被插入了mysql。
我不熟悉异步和并行编程,我用这种方式编写代码,但我想知道这是否是在mysql上执行异步查询的正确方法。我也是这样做的,但是使用mongodb,效果很好。希望你们能帮我。谢谢。

6yjfywim

6yjfywim1#

connector/net(mysql.data)中的一个长期错误是 Async 方法实际上是异步执行的:bug 70111。
要解决这个问题,您可以切换到另一个ado.net mysql库,它是100%异步的:github和nuget上的mysqlconnector。
尽管mysqlconnector实现了 CloseAsync 方法时,默认实现会同步返回到连接池的打开连接,因此我建议省略 CloseAsync 打个电话就用个电话 using 阻止到 Dispose 连接完成后:

using (var connection = new MySqlConnection(string.Format(configuration["MySql:ConnectionString"], configuration["MySql:DataBaseName"])))
{
    await connection.OpenAsync();
    var query = "...";
    using (var cmd = new MySqlCommand(query, connection))
        await cmd.ExecuteReaderAsync();
}

相关问题