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而不手动使其异步?
我使用的是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
。但是,在大多数情况下,您可能不需要这样做。
您可能会发现它有类似BeginXXX
和EndXXXX
的方法,您可以将它们与Task.Factory.FromAsync
结合使用。点击此处了解更多信息。
以下是使用Task.Factory.FromAsync
与filestream.BeginRead
和filestream.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