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

Другие вопросы по тегам