的我有以下代碼:性能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個異步方法來獲取此信息。這是一個很好的異步用例嗎?我應該轉換爲同步代碼嗎?
我擔心從this微軟的一篇文章顯示了一個簡單的異步調用生成的IL代碼的建議出現。
對於初學者來說,你處理後不重新拋出的catch塊的異常,並重新進行查詢。 –
該函數然後需要返回其他東西;我想讓它不能處理,所以它可能會被進一步捕獲(除非有更好的方法來做這件事,那我就錯過了)。 – Hele