提问者:小点点

执行两个查询作为任务[重复]


我需要帮助了解中是如何工作的。我想为中的每个子句调用一次。我想我应该创建一个任务列表,然后

await Task.WhenAll(taskList);

最后我可以得到每个任务的结果。这是我目前所掌握的:

public async Task Execute(string[] clauses)
{
    var taskList = new List<Task<in>>();

    // Here I want to call ExecuteClause for each string in clauses
    // and wait for the result.
}

private async Task<int> ExecuteClause(string clause)
{
    var connectionString = ConfigurationManager.ConnectionStrings["default"].ConnectionString;
    var connection = new SqlConnection(connectionString);
    await connection.OpenAsync();

    var r = await new SqlCommand(clause, connection).ExecuteReaderAsync();

    while (await r.ReadAsync())
    {
        ...
    }

    r.Close();

    connection.Close();

    // Just an example returning an int
    return 1;
}

共1个答案

匿名用户

我想答案比你想象的要简单。

您将循环访问数组,并在每次迭代中向taskList添加一个新任务。之后,您将使用WhenAll将所有单独的任务聚合到一个单独的任务中,当所有组成任务完成时,该任务将返回:

public async Task Execute(string[] clauses)
{
    var taskList = clauses.Select(ExecuteClause);
    return Task.WhenAll(taskList);
}

您需要修复方法以确保正确处理,因为它当前的编写方式可能无法处理所有情况下的连接:

private async Task<int> ExecuteClause(string clause)
{
    var connectionString = ConfigurationManager
                 .ConnectionStrings["default"].ConnectionString;
    using (var connection = new SqlConnection(connectionString)) {

        await connection.OpenAsync();

        var r = await new SqlCommand(clause, connection).ExecuteReaderAsync();

        while (await r.ReadAsync())
        {
            ...
        }

        r.Close();

        connection.Close();
    }
    // Just an example returning an int
    return 1;
}