我需要帮助了解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;
}
答案 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;
}