wait/async Microsoft Practices企业库数据

本文关键字:企业库 数据 Practices Microsoft async wait | 更新日期: 2023-09-27 17:58:02

我有一个旧的应用程序,我在其中使用Microsoft.Practices.EnterpriseLibrary.Data从DB获取数据。我最近升级到了.NET 4.5,并希望利用等待/异步

根据命名标准,我看不到任何以"Async"结尾的方法,即使在包的最新版本中也是如此。有没有可能在这个ADO.NET库中使用wait/async而不手动使其异步?

wait/async Microsoft Practices企业库数据

我使用的是EL的旧版本,它提供Begin*/End*方法,但不提供异步版本。一些简单的扩展方法简化了生活:

public static async Task<IDataReader> ExecuteReaderAsync(this SqlDatabase database, DbCommand command)
{
    return await Task<IDataReader>.Factory.FromAsync(database.BeginExecuteReader, database.EndExecuteReader, command, null);
}
public static async Task<object> ExecuteScalarAsync(this SqlDatabase database, DbCommand command)
{
    return await Task<object>.Factory.FromAsync(database.BeginExecuteScalar, database.EndExecuteScalar, command, null);
}
public static async Task<XmlReader> ExecuteXmlReaderAsync(this SqlDatabase database, DbCommand command)
{
    return await Task<XmlReader>.Factory.FromAsync(database.BeginExecuteXmlReader, database.EndExecuteXmlReader, command, null);
}
public static async Task<int> ExecuteNonQueryAsync(this SqlDatabase database, DbCommand command)
{
    return await Task<int>.Factory.FromAsync(database.BeginExecuteNonQuery, database.EndExecuteNonQuery, command, null);
}

我实际上能够找到Async方法。我只是找错地方了。以下是异步访问数据库的两种常见方法:

var db = DatabaseFactory.CreateDatabase(GlobalConstants.DBConnection);
using (var cmd = db.GetStoredProcCommand("SprocName", parameterA))
{
    await cmd.ExecuteNonQueryAsync();
}

当你想获取数据时:

var db = DatabaseFactory.CreateDatabase(GlobalConstants.DBConnection);
using (var cmd = db.GetStoredProcCommand("SprocName", parameterA, parameterB, parameterC))
{
    using (var dr = await cmd.ExecuteReaderAsync())
    {
        while (await dr.ReadAsync())
        {
            return dr.GetInt32(0);
        }
    }
}

如果使用具有大量数据的CommandBehavior.SequentialAccess,则可以使用GetFieldValueAsync<T>而不是GetInt32。但是,在大多数情况下,您可能不需要这样做。

您可能会发现它有类似BeginXXXEndXXXX的方法,您可以将它们与Task.Factory.FromAsync结合使用。点击此处了解更多信息。

以下是使用Task.Factory.FromAsyncfilestream.BeginReadfilestream.EndRead 一起读取文件的示例

private async Task<string> ReadFileAsync()
{
  var fileStream = File.OpenRead("..''..''..''test.txt"); 
  var buffer = new byte[1024];
  await Task<int>.Factory.FromAsync(fileStream.BeginRead, fileStream.EndRead, buffer, 0, buffer.Length, null);
  return System.Text.Encoding.ASCII.GetString(buffer);
}

此包最初是在.NET 4.0中编写的。如果您查看它们的源代码,它们不会在任何地方使用async/await。http://topaz.codeplex.com/SourceControl/latest#source/Source/TransientFaultHandling/AsyncExecution.cs