C# MySql连接方法是否支持异步编程?
我使用一种简单的方法连接到MySql数据库,但是连接到这个数据库需要一段时间&这会导致应用程序处于“无响应”模式。 现在,我可以使用async来解决这个问题吗 脚本是:C# MySql连接方法是否支持异步编程?,c#,mysql,winforms,visual-studio,asynchronous,C#,Mysql,Winforms,Visual Studio,Asynchronous,我使用一种简单的方法连接到MySql数据库,但是连接到这个数据库需要一段时间&这会导致应用程序处于“无响应”模式。 现在,我可以使用async来解决这个问题吗 脚本是: Private void button_clicked() { MysqlConnection connection = new MysqlConnection(constring); connection.open(); } 我相信这是可能的。除了像下面()那样构造代码之外: 还可以通过添加“异步处理=true”连接属性()
Private void button_clicked()
{
MysqlConnection connection = new MysqlConnection(constring);
connection.open();
}
我相信这是可能的。除了像下面()那样构造代码之外: 还可以通过添加“异步处理=true”连接属性()来更新连接字符串 我还建议您看看“OpenAsync”方法。您可以在.MySQL Connector/NET(即MySQL.Data)公开异步ADO.NET方法中了解更多信息,例如,
MySqlConnection.OpenAsync
,MySqlCommand.ExecuteNonQueryAsync
,但这些方法都是同步执行的。这是一个in连接器/网络
您可以通过切换到MySqlConnector(,)来获得异步数据库操作,MySqlConnector(,)是一种提供异步I/O和更高性能的OSS替代方案。最后,我根据@MikaalAnwar的答案找到了确切的答案 我们不需要向连接字符串添加任何新选项(如
异步处理=true
);这是针对SQL连接的&不适用于MySql
那么,我们现在该怎么办
我们将任何被视为具有异步选项的无效项,async
。然后我们添加一个等待任务并运行它(task.run
)。在这项任务中,我们想用我们的关系做什么就做什么
例如:(我们不想使用任何数据集)
&我们不使用DBConnection.OpenAsync()
,因为void是异步的&我们使用wait来完成任务
完成:)如果你能提供一个。也许值得一读。Mjwills:非常感谢!使用
Task.Run
将阻塞代码卸载到线程池是个坏主意:相反,使用MySqlConnector获得真正的异步数据库操作。最后,asynchronousprocessing=true
是一个SQL Server连接字符串选项;如果您尝试在MySQL中使用它,它将抛出一个错误。您应该在连接字符串中使用异步进程选项。。。没错,这是Sql的,不是Mysql的。。。但我试过这样做:1.使相关的void异步2。创建一个任务并运行它3。使任务等待4。将所有连接进程放入任务中。。。它运行良好@BradeyGrainger但我解决了它!使用Mysql.Data更好地处理任务&它在异步性能方面没有任何问题@BradleyGrainger如果必须使用MySql.Data,并且要从UI线程调用它,那么使用Task.Run
是将该工作转移到后台线程的唯一方法。但一般来说,在大多数环境中,使用Task.Run
使阻塞异步工作是一个坏主意:
public Task<DataSet> GetDataSetAsync(string sConnectionString, string sSQL, params SqlParameter[] parameters)
{
return Task.Run(() =>
{
using (var newConnection = new SqlConnection(sConnectionString))
using (var mySQLAdapter = new SqlDataAdapter(sSQL, newConnection))
{
mySQLAdapter.SelectCommand.CommandType = CommandType.Text;
if (parameters != null) mySQLAdapter.SelectCommand.Parameters.AddRange(parameters);
DataSet myDataSet = new DataSet();
mySQLAdapter.Fill(myDataSet);
return myDataSet;
}
});
}
//Use Async method to get data
DataSet results = await GetDataSetAsync(sConnectionString, sSQL, sqlParams);
private async void DBConnect(String connectionString)
{
await Task.Run(() =>
{
MySqlConnection dbConnection = new MySqlConnection(connectionString);
dbConnection.Open();
}
);
}