await / async Microsoft Practices企业库数据

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

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

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

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

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

  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而不是GetInt32 。 但是,对于大多数情况,您可能不需要这样做。

你可能会发现它有像BeginXXXEndXXXX这样的方法,你可以将它们与Task.Factory.FromAsync结合使用。 更多信息在这里 。

下面是使用Task.Factory.FromAsync结合filestream.BeginReadfilestream.EndRead使用它来读取文件的filestream.EndRead

 private async Task ReadFileAsync() { var fileStream = File.OpenRead("..\\..\\..\\test.txt"); var buffer = new byte[1024]; await Task.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