2016-12-14 6 views
1

У меня есть следующий код:Производительности 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, сгенерированный для простого асинхронного вызова.

+0

Для начала не удаляйте исключение из блока catch после его обработки и повторите запрос. –

+0

Затем функция должна вернуть что-то еще; Я хочу оставить его необработанным, чтобы его можно было поймать дальше (если нет лучшего способа сделать это, что мне не хватает). – Hele

ответ

1

Ответ на это зависит, и в основном от вашего контекста. Если эти методы работают в контексте чего-то с активным SynchronizationContext; например WinForms, ASP.NET, WPF, то вы почти наверняка предпочтете async, чтобы не блокировать основной поток. Это особенно важно в вашем случае, поскольку вы подразумеваете, что действие базы данных часто истекает, в течение которого основной поток в противном случае был бы заблокирован все время.

статья Стивена Toub по ссылке на это - как всегда - отлично, но, как он говорит, - особенно в других своих статьях - накладные расходы асинхронной совершенно незначительна по сравнению со стоимостью большинства операций ввода/вывода, особенно сетевой вызов в вашу базу данных.

+0

Используется ли это, если сетевой вызов превышает локальный хост? – Hele

+0

@Hele: ​​yes - дисковый ввод-вывод базы данных (вероятный) и требуемые межпроцессные коммуникации будут по-прежнему превышать любые асинхронные служебные данные. – sellotape

0

Я думаю, вы не должны конвертировать в синхронный код, потому что асинхронный дает вам лучшую производительность. В этом случае ваш код не блокируется - поэтому система будет использовать меньше потоков ...

Смежные вопросы