为什么要在方法中间等待异步方法?

时间:2016-08-03 17:28:31

标签: c# async-await

我在书中使用async / await找到了这个例子。可以请有人告诉我等待异步方法的好处是什么,如下例所示?

using (SqlConnection connection = new SqlConnection(connectionString))
{
  SqlCommand command = new SqlCommand("SELECT * FROM People", connection);
  await connection.OpenAsync();
  SqlDataReader dataReader = **await** command.ExecuteReaderAsync();
  while (**await** dataReader.ReadAsync())
  {
    string formatStringWithMiddleName = "Person ({0}) is named {1} {2} {3}";
    string formatStringWithoutMiddleName = "Person ({0}) is named {1} {3}";
    if ((dataReader["middlename"] == null))
    {
      Console.WriteLine(formatStringWithoutMiddleName,
      dataReader["id"],
      dataReader["firstname"],
      dataReader["lastname"]);
    }
    else
    {
      Console.WriteLine(formatStringWithMiddleName,
      dataReader["id"],
      dataReader["firstname"],
      dataReader["middlename"],
      dataReader["lastname"]);
    }
  }
  dataReader.Close();
  }
}

我无法绕过这个。我理解的方式是等待阻塞,直到调用的方法(在这种情况下,ExecuteReaderAsync和ReadAsync)返回。什么是调用异步方法并立即在代码中间阻塞,而不是在调用异步方法和结果返回给调用者之间实际执行任何操作的重点是什么? 比简单地这样做更快还是更有效?

...

SqlDataReader dataReader = command.ExecuteReader();
      while (dataReader.Read())
      {
           .....

2 个答案:

答案 0 :(得分:5)

  

我理解的方式是等待阻塞,直到调用的方法(在本例中为ExecuteReaderAsync和ReadAsync)返回。

没有; await暂停该方法并返回给调用者。因此,它在<{1}}操作期间阻塞调用线程。

从概念上讲,它是同步串行之间的区别。同步意味着阻塞:方法调用会停止线程,直到ReadAsync完成。 Serial一次表示一个:该方法将暂停执行,直到Read完成。因此,常见的ReadAsync模式是串行的,但是以异步方式,而不是同步方式。

有关await *Async()async的详情,请参阅我的async intro帖子。

答案 1 :(得分:0)

这会暂时阻止您的方法,但会保持UI线程响应。在内部C#重写方法。 await之后的部分被转换为一种回调方法(不是真的,但你可以想象它是)。该方法立即返回await,并在异步操作完成时从它停止的位置恢复。