Вы делаете этот метод асинхронным так же, как и любой другой метод асинхронным.Вы помечаете метод как асинхронный, чтобы он возвращал Task, если он возвращает void или Task, где T - это класс, который он ранее возвращал.Измените его, чтобы использовать синхронные версии любых доступных методов и ожидать результатов.
Ваша обработка исключений здесь не является хорошей.Во-первых, вы делаете throw e;
, где e - пойманное исключение.Не делай этого.Если вам нужно сбросить пойманную исключительную ситуацию, просто наберите throw;
.Таким образом вы сохраните свой след стека.Кроме того, эта попытка / улов абсолютно бессмысленна.Если вы не собираетесь предпринимать какие-либо корректирующие действия или что-либо регистрировать, это бессмысленно.Вы можете полностью удалить try / catch из этого кода.
Вы неправильно обрабатываете соединение с базой данных.OracleConnection реализует IDisposable .Вам нужно либо использовать оператор using, либо удалить его в блоке finally.
Имя класса говорит: GetProducts, но вы просто возвращаете объект.Это не очень хорошоТеперь любой потребляющий код должен будет привести его к правильному типу, чтобы использовать его.Весь смысл Dapper в том, что он может сопоставить ваш запрос со строго типизированным объектом.Основываясь на названии этого метода, вы должны возвращать IEnumerable или что-то в этом роде.
Вы проверяете состояние соединения с базой данных сразу после его получения.Там нет смысла в этом.Если вы получили новое соединение, вы можете предположить, что оно закрыто и вам нужно его открыть.
Принимая все это во внимание, вы должны получить что-то вроде этого:
public IDbConnection GetConnection()
{
var connectionString = configuration.GetSection("ConnectionStrings").GetSection("AsyncDB").Value;
var conn = new OracleConnection(connectionString);
return conn;
}
public Task<IEnumerable<Product>> GetProducts()
{
OracleDynamicParameters dynamicParameters = new OracleDynamicParameters();
dynamicParameters.Add("EMPCURSOR", OracleDbType.RefCursor, ParameterDirection.Output);
const string query = "SPGETPRODUCTINFO";
using (var conn = this.GetConnection())
{
await conn.OpenAsync();
var products = await conn.QueryAsync<Product>(query, param: dynamicParameters, commandType: CommandType.StoredProcedure);
return products;
}
}
Сейчасчто GetProducts является асинхронным, любой метод выше, который вызывает его, должен быть асинхронным и изменен, чтобы возвращать задачу и ожидать ее.И любой метод, который вызывает асинхронный вызов и должен быть изменен, чтобы вернуть задачу и ожидать ее.Весь путь вверх по стеку вызовов, пока не дойдете до обработчика событий или основного метода для вашего приложения.