DB异步调用的性能

时间:2016-12-14 03:26:42

标签: c# async-await

我有以下代码:

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代码。

2 个答案:

答案 0 :(得分:1)

答案取决于它,主要取决于你的背景。如果这些方法在具有活动SynchronizationContext的内容的上下文中运行;例如WinForms,ASP.NET,WPF,那么你几乎肯定会更喜欢异步,以免阻塞主线程。这在您的情况下尤其重要,因为您暗示您的数据库操作经常超时,否则主线程将在整个时间内被阻塞。

Stephen Toub发表的文章 - 一如既往 - 优秀,正如他所说 - 特别是在他的其他文章中 - 与大多数I / O的成本相比,异步开销是微不足道的操作,尤其是对数据库的网络调用。

答案 1 :(得分:0)

我认为您不应该转换为同步代码 - 因为异步会为您提供更好的性能。在这种情况下,您的代码不会被阻止 - 因此系统将使用更少的线程...