执行两个查询作为任务

时间:2018-02-09 15:14:10

标签: c# task

我需要帮助了解Taskc#中的运作方式。我想为ExecuteClause中的每个条款拨打clauses一次。我已经发现我应该创建一个任务列表然后

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 个答案:

答案 0 :(得分:0)

我认为答案比你怀疑的要简单。

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

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

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

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;
}