代码如下:
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,效果很好。希望你们能帮我。谢谢。
1条答案
按热度按时间6yjfywim1#
connector/net(mysql.data)中的一个长期错误是
Async
方法实际上是异步执行的:bug 70111。要解决这个问题,您可以切换到另一个ado.net mysql库,它是100%异步的:github和nuget上的mysqlconnector。
尽管mysqlconnector实现了
CloseAsync
方法时,默认实现会同步返回到连接池的打开连接,因此我建议省略CloseAsync
打个电话就用个电话using
阻止到Dispose
连接完成后: