【问题标题】:The 'await' operator can only be used within an async method [MySQL connector]'await' 运算符只能在异步方法中使用 [MySQL 连接器]
【发布时间】:2019-02-24 08:11:06
【问题描述】:

这个问题与我最近几天在 StackOverflow 上发布的两个问题有关。

关于 MySqlClient EndOfStreamException 的第一个问题。

1st Question

第一个问题的答案引导我将库从 MySQL ADO.NET 切换到 MySQL 连接器。

自从从 MySQL ADO.NET 迁移到 MySQL 连接器后,我遇到了一些 MySQL 关键字的问题。我也得到了这个问题的答案。

2nd Question

现在程序正在运行,没有任何错误。但不幸的是,有一个问题,因为数据并没有写入数据库。

为了找到解决此问题的方法,我尝试将 "await" 关键字添加到 ExecuteNonQueryAsync() 中,如下代码所示。

 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();
                }



        }

在实现这个之前,我认为问题在于执行行,因为任何数据都没有写回数据库。

这就是它说服我在这个example 中同样给出的源代码中包含 await 打开和执行行的原因。

不幸的是,在我使用过的所有地方 await 关键字(在上面的代码中突出显示)都触发了错误:

错误 CS4032 'await' 运算符只能在异步中使用 方法。考虑用'async'修饰符标记这个方法和 将其返回类型更改为“任务”。

如何解决这个问题,您认为数据库没有更新的原因是什么?

如果这个 'await' 方法实现正确,会不会修复?

【问题讨论】:

标签: c# mysql mysql-connector


【解决方案1】:

异步代码更复杂。我建议您坚持使用(完全支持的)同步方法,直到您的数据库代码正常工作。所以把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]);会更直接。

一旦您的数据库代码正常工作,并且想要切换到异步,您可以在方法主体中使用await,然后使用async 关键字重新声明方法签名,例如private async Task&lt;bool&gt; OpenConnection()

【讨论】:

  • 我已经更改了您提到的 3 个 AddWithValue() 语句。但是,数据库仍然没有更新@Bradley Grainger
  • @simon 你能用你最新的代码更新你的问题吗?
  • @Simon 我在该代码中看到的第一件事是conn.OpenAsync();。正如我在回答中所写,你不能这样做。阅读 async/await docs.microsoft.com/en-us/dotnet/csharp/programming-guide/… 和总是 await Async 方法,或者(我的建议)只是调用同步方法。
  • 嘿布拉德利,奇怪的是,当我尝试使用 F11(步入)运行程序时,它实际上可以工作。数据库更新成功。但是当我尝试使用 F5 完全运行时,会出现上述异常。我认为有一个时间问题。有什么建议? @Bradley Grainger
  • 该错误消息表明网络上接收到的二进制协议数据不是预期的。我不知道 SSH 隧道如何处理多个同时连接;多个数据流似乎有可能混在一起?数据包捕获(在您的应用程序和 SSH 隧道的本地端之间的数据包)可能会阐明这个问题。
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
相关资源
最近更新 更多