У меня есть следующий код:Производительности DB асинхронного вызова
public static async Task<uint?> GetJobAsync(string name)
{
return await Program.Database.PerformQueryAsync<uint?>(async (command) =>
{
command.CommandText = "SELECT `job` FROM `people` WHERE `name`[email protected];";
command.Parameters.Add(new MySqlParameter("name", name));
MySqlDataReader reader = await command.ExecuteReaderAsync() as MySqlDataReader;
if (!reader.HasRows)
return null;
reader.Read();
return reader.GetUInt32(0);
});
}
public async Task<T> PerformQueryAsync<T>(Func<MySqlCommand, Task<T>> operationAsync)
{
try
{
using (MySqlCommand command = CreateCommand())
return await operationAsync(command);
}
catch (MySqlException ex)
{
if (ex.GetBaseException() is SocketException)
{
Console.WriteLine("MySQL connection was broken. Reconnecting...");
if (!IsConnected())
Connect();
using (MySqlCommand command = CreateCommand())
return await operationAsync(command);
}
throw;
}
}
Вторая функция существует в качестве лежащего в основе соединения MySQL часто wait_timeout
с. Мой SQL-запрос короткий и занимает меньше времени. Однако для получения этой информации вызываются 3 асинхронных метода. Является ли это хорошим вариантом использования async? Должен ли я конвертировать в синхронный код?
Вопросы, связанные с предложением в статье this Microsoft, показывающей код Il, сгенерированный для простого асинхронного вызова.
Для начала не удаляйте исключение из блока catch после его обработки и повторите запрос. –
Затем функция должна вернуть что-то еще; Я хочу оставить его необработанным, чтобы его можно было поймать дальше (если нет лучшего способа сделать это, что мне не хватает). – Hele