我使用一种简单的方法连接到MySql数据库,但是连接到这个数据库需要一段时间&这导致应用程序处于"没有响应"模式。 现在,我可以使用异步来解决这个问题吗?
脚本是:
Private void button_clicked()
{
MysqlConnection connection = new MysqlConnection(constring);
connection.open();
}
答案 0 :(得分:1)
MySQL Connector / NET(即MySql.Data)公开了异步ADO.NET方法,例如MySqlConnection.OpenAsync
,MySqlCommand.ExecuteNonQueryAsync
,但这些方法都是同步执行的。这是Connector / NET中的longstanding bug。
您可以通过切换到MySqlConnector(NuGet,GitHub)来获得异步数据库操作,这是一种提供异步I / O和更高性能的OSS替代方案。
答案 1 :(得分:-1)
我确信这是可能的。除了像以下(source)构建代码之外:
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;
}
});
}
结合使用“await”关键字,可以获得所需的结果。
//Use Async method to get data
DataSet results = await GetDataSetAsync(sConnectionString, sSQL, sqlParams);
还通过添加“异步处理=真实”连接属性(source)来更新连接字符串
我还建议您查看“ OpenAsync ”方法。您可以在docs。
中详细了解相关信息答案 2 :(得分:-2)
最后,我根据@ MikaalAnwar的答案找到了确切的答案!
我们不需要在连接字符串中添加任何新选项(如
Asynchronous Processing=true
);这是针对SQL连接的不适用于MySql。
那么,我们现在该怎么办?
我们使任何被尊重的void都具有异步选项
async
。然后我们添加一个等待任务&amp;运行它(Task.Run
)。在这项任务中,我们通过连接完成了我们想要的任务。
例如:(我们不想使用任何数据集)
private async void DBConnect()
{
awiat Task.Run(() =>
MySqlConnection DBConnetion = new MySqlConnection(ConString);
DBConnection.Open();
});
&安培;我们不使用
DBConnection.OpenAsync()
,因为虚空是异步&amp;我们已经等待了这项任务。
表面处理:)