Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 作为任务执行两个查询_C#_Task - Fatal编程技术网

C# 作为任务执行两个查询

C# 作为任务执行两个查询,c#,task,C#,Task,我需要帮助了解Task如何在c中工作。我想为子句中的每个子句调用ExecuteClause一次。我想我应该创建一个任务列表,然后 await Task.WhenAll(taskList); 最后我可以得到每个任务的结果。这就是我到目前为止所做的: public async Task Execute(string[] clauses) { var taskList = new List<Task<in>>(); // Here I want to cal

我需要帮助了解
Task
如何在
c
中工作。我想为
子句
中的每个子句调用
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=新列表();
//这里我想为子句中的每个字符串调用ExecuteClause
//然后等待结果。
}
专用异步任务ExecuteClause(string子句)
{
var connectionString=ConfigurationManager.connectionString[“默认值”].connectionString;
var connection=newsqlconnection(connectionString);
等待连接。OpenAsync();
var r=wait new SqlCommand(子句,connection).ExecuteReaderAsync();
while(等待r.ReadAsync())
{
...
}
r、 Close();
connection.Close();
//只是一个返回int的示例
返回1;
}

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

您将循环遍历
子句
数组,并在每次迭代中将新任务添加到任务列表中。之后,您将使用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;
}
private async Task executecause(string子句)
{
var connectionString=ConfigurationManager
.ConnectionString[“默认值”]。ConnectionString;
使用(var连接=新的SqlConnection(connectionString)){
等待连接。OpenAsync();
var r=wait new SqlCommand(子句,connection).ExecuteReaderAsync();
while(等待r.ReadAsync())
{
...
}
r、 Close();
connection.Close();
}
//只是一个返回int的示例
返回1;
}

var taskList=子句。选择(c=>ExecuteClause(c))或使用一个简单的
进行
循环。@DavidG Brilliant!我想我现在终于明白它是怎么工作的了。比我想象的容易多了@DavidG-您还可以使用ExecuteClause作为调用的方法组Select@JoshE是的,这可能就是我用代码编写它的方式,但出于这样的目的,它经常会让人困惑。谢谢。关于使用
的优点很好。如何使用您在上面评论的方法组?我现在看到您已经将其作为方法组使用。。。