我有以下代码:
public static async Task<uint?> GetJobAsync(string name)
{
return await Program.Database.PerformQueryAsync<uint?>(async (command) =>
{
command.CommandText = "SELECT `job` FROM `people` WHERE `name`=@name;";
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代码。
答案 0 :(得分:1)
答案取决于它,主要取决于你的背景。如果这些方法在具有活动SynchronizationContext
的内容的上下文中运行;例如WinForms,ASP.NET,WPF,那么你几乎肯定会更喜欢异步,以免阻塞主线程。这在您的情况下尤其重要,因为您暗示您的数据库操作经常超时,否则主线程将在整个时间内被阻塞。
Stephen Toub发表的文章 - 一如既往 - 优秀,但正如他所说 - 特别是在他的其他文章中 - 与大多数I / O的成本相比,异步开销是微不足道的操作,尤其是对数据库的网络调用。
答案 1 :(得分:0)
我认为您不应该转换为同步代码 - 因为异步会为您提供更好的性能。在这种情况下,您的代码不会被阻止 - 因此系统将使用更少的线程...