await / async Microsoft Practices企业库数据

时间:2014-04-11 22:24:15

标签: c# ado.net async-await enterprise-library asp.net-4.5

我有一个较旧的应用程序,我在其中使用Microsoft.Practices.EnterpriseLibrary.Data从数据库中获取数据。我最近升级到.NET 4.5并希望利用 await / async

根据命名标准,我没有看到任何以“Async”结尾的方法,即使在最新版本的软件包中也是如此。是否可以对此ADO .NET库使用await / async而无需手动使其异步?

4 个答案:

答案 0 :(得分:9)

I'm using an older version of the EL that offers Begin* / End* methods, but not async versions. Some simple extension methods simplify life:

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

答案 1 :(得分:6)

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

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

如果您使用包含大量数据的GetFieldValueAsync<T>,则可以使用GetInt32代替CommandBehavior.SequentialAccess。但是,对于大多数情况,您可能不需要这样做。

答案 2 :(得分:0)

您可能会发现它有BeginXXXEndXXXX等方法,您可以将它们与Task.Factory.FromAsync结合使用。更多信息here

以下是使用Task.Factory.FromAsync结合filestream.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);
}

答案 3 :(得分:-3)

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