![](/img/trans.png)
[英]await operator can only be used within an async method - but method is asynchron
[英]The 'await' operator can only be used within an async method [MySQL connector]
这个问题与我最近的2个问题相关,这些问题是最近几天发布在StackOverflow上的。
第一个问题与MySqlClient EndOfStreamException有关。
第一个问题的答案使我转向将库从MySQL ADO.NET切换到MySQL连接器。
从MySQL ADO.NET迁移到MySQL连接器后,我的一些MySQL关键字出现了一些问题。 我也得到了这个问题的答案。
现在程序正在运行,没有任何错误。 但是不幸的是,由于没有将数据写入数据库,因此存在问题。
为了找到解决此问题的方法,我尝试从以下代码开始向ExecuteNonQueryAsync()添加“ await”关键字。
private bool OpenConnection()
{
try
{
//connection.Open(); //line commented
**await connection.OpenAsync();**
Console.WriteLine("MySQL connected.");
return true;
}
catch (MySqlException ex)
{
}
public void Insert()
{
if (this.OpenConnection() == true)
{
using(var reader = new StreamReader(@"C:\Users\Admin\source\Bargstedt.csv"))
{
//List<string> listA = new List<string>();
while (!reader.EndOfStream)
{
***await reader.OpenAsync();***
var line = reader.ReadLine();
var values = line.Split(',');
string querynew = "INSERT INTO jobs"
+ "(nJobNumber,strClientReference,datPromisedDelivery)"
+ "VALUES (@jobNo, @strClientName, @strClientReference)";
var cmd = new MySqlCommand();
cmd.CommandText= querynew;
cmd.Parameters.AddWithValue("strClientName", "MySqlDbType.VarChar").Value =(values[1]);
cmd.Parameters.AddWithValue("strClientReference", "MySqlDbType.VarChar").Value = values[2];
***await cmd.ExecuteNonQueryAsync();***
// cmd.ExecuteNonQueryAsync(); //Line commented
}
}
this.CloseConnection();
}
}
在实施此功能之前,我认为问题出在执行行上,因为任何数据都不会写回到数据库中。
这就是它说服我包括等待打开并执行本示例中给出的源代码行的原因。
不幸的是,在我使用过await关键字的所有地方(在上面的代码中突出显示)都触发错误:
错误CS4032“等待”运算符只能在异步方法中使用。 考虑使用“异步”修饰符标记该方法,并将其返回类型更改为“任务”。
如何解决此问题,您认为数据库未更新的原因是什么?
如果此“等待”方法正确实施,是否可以解决?
异步代码更加复杂。 我建议您坚持使用(完全支持的)同步方法,直到您的数据库代码正常工作为止。 因此更改await connection.OpenAsync();
回到connection.Open();
, await cmd.ExecuteNonQueryAsync();
到cmd.ExecuteNonQuery()
等。
(不要在不使用await
语句的情况下调用Async
方法,因为它会在您的主方法保持运行状态时继续在后台执行,这可能会导致在两个单独的线程上同时使用同一连接,从而导致错误。)
您提供的示例代码未为@jobNo
添加参数值。 这将导致异常,因为未定义参数。
代码cmd.Parameters.AddWithValue("strClientName", "MySqlDbType.VarChar").Value =(values[1])
错误地添加了带有文字字符串值"MySqlDbType.VarChar"
,然后将其覆盖。 编写cmd.Parameters.AddWithValue("strClientName", values[1]);
会更直接cmd.Parameters.AddWithValue("strClientName", values[1]);
。
一旦您的数据库代码正常工作,并想要切换到异步,就可以在方法主体内使用await
,然后使用async
关键字重新声明方法签名,例如, private async Task<bool> OpenConnection()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.