C# 数据库异步数据访问

访问数据库可能要花一些时间。这里不应该阻塞用户界面。ADO.NET 类 通过异步方法和同步方法提供了基于任务的异步编程。下面的代码片段类似于上一个使用 SqlDataReader 的代码,但它使用了异步的方法调用。连接用SqlConnection.OpenAsync 打开,读取器从SqlCommand.ExecuteReaderAsync 方法中返回,记录使用SqIDataReader.ReadAsync 检索。在所有这些方法中,调用线程没有阻塞,但是可以在得到结果前,执行其他模作:.

public static async Task Main()
{
  await ReadAsync("Wrox Press");
}

public static async Task ReadAsync(int productId)
{
  var connection = new SqlConnection(GetConnectionString());
  
  string sql = "SELECT [Title], [Publisher],[ReleaseDate] " + 
    "FROM [ProCSharp].[Books] WHERE lower([Title]) " +
    "Like @Title ORDER BY [ReleaseDate]";
   var command = new SqlCommand(sql, connection);
   var titleParameter = new SqlParameter("Title", SqldbType.NVarChar, 50); 
   titleParameter.Value = title;
   command.Parameters.Add(titleParameter);
     
   await connection.OpenAsync();
     
   using (SqlDataReader reader =
     await command.ExecuteReaderAsync(CommandBehavior.CloseConnection))
   {
     while (await reader.ReadAsync())
     {
       int id = reader.GetInt32(0);
       string bookTitle = reader.GetString(1); 
       string publisher = reader[2].ToString(); 
       DateTime? releaseDate =
         reader.IsDBNull(3) ? (DateTime?)null : reader.GetDateTime(3); 
       Console.WriteLine($"{id,5}. {bookTitle,-40} {publisher,-15} " +
         $"{releaseDate:d}");
    }
  }
}

使用异步方法调用,不仅有利于 Windows 应用程序,也有利于在服务器端同时进行多个调用。ADO.NET API 的异步方法有重载版本来支持 CancellationToken,使长时间运行的方法早些停止。