【问题标题】:Execute two queries as tasks [duplicate]执行两个查询作为任务[重复]
【发布时间】:2018-07-20 09:36:04
【问题描述】:

我需要帮助来了解 Task 在 c# 中的工作原理。我想为clauses 中的每个子句调用一次ExecuteClause。我发现我应该创建一个任务列表,然后

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

【问题讨论】:

  • var taskList = clauses.Select(c =&gt; ExecuteClause(c)); 或者只使用一个简单的for 循环。
  • @DavidG 太棒了!我想我现在终于明白它是如何工作的了。比我想象的要容易得多!
  • @DavidG - 你也可以使用 ExecuteClause 作为调用 Select 的方法组
  • @JoshE 是的,这就是我可能会用代码编写它的方式,但出于 SO 目的,它经常使人们感到困惑。

标签: c# task


【解决方案1】:

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

您将遍历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;
}

【讨论】:

  • 谢谢。关于using 的好点。使用您上面评论的方法组怎么样?
  • 我现在看到您已经将它用作方法组...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多