代码之家  ›  专栏  ›  技术社区  ›  Asken

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

  •  -1
  • Asken  · 技术社区  · 8 年前

    我需要帮助了解 Task 在中工作 c# . 我想打电话 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 回复  |  直到 8 年前
        1
  •  0
  •   Josh E    8 年前

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

    您将在 clauses 数组,并在每次迭代中将新任务添加到任务列表中。之后,您将使用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;
    }