await/async Данные библиотеки Microsoft Practices для предприятий
У меня есть старое приложение, которое я написал, где я использовал Microsoft.Practices.EnterpriseLibrary.Data
получить данные из БД. Я недавно обновился до.NET 4.5 и хотел воспользоваться преимуществами await/async.
Я не вижу каких-либо методов, заканчивающихся на "Async" в соответствии со стандартом именования, даже в самой последней версии пакета. Можно ли использовать await/async с этой библиотекой ADO .NET, не делая ее вручную асинхронной?
4 ответа
Я действительно смог найти методы 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);
}
}
}
Ты можешь использовать GetFieldValueAsync<T>
вместо GetInt32
если вы используете CommandBehavior.SequentialAccess
с большими объемами данных. Но в большинстве случаев вам, вероятно, не нужно этого делать.
Я использую более старую версию 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);
}
Вы, вероятно, обнаружите, что у него есть такие методы, как 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