如果你想正确使用 async-await,你必须声明你的函数是异步的,并且调用你的函数也必须是异步的。这一直持续到您拥有启动异步过程的一次同步函数。
您的函数如下所示:
顺便说一句,您没有描述列表中的内容。我假设它们是 T 类型的对象。在这种情况下 result.SearchResult.Item 返回 IEnumerable
private async Task<List<T>> FindItems(...)
{
int total = result.paginationOutput.totalPages;
var newList = new List<T>();
for (int i = 2; i < total + 1; i++)
{
IEnumerable<T> result = await Task.Factory.StartNew(() =>
{
return client.findItemsByProduct(i);
});
newList.AddRange(result.searchResult.item);
}
return newList;
}
如果你这样做,你的函数将是异步的,但是 findItemsByProduct 会一个接一个地执行。如果你想同时执行它们,你不应该等待结果,而是在前一个任务完成之前开始下一个任务。一旦所有任务都开始等待,直到所有任务都完成。像这样:
private async Task<List<T>> FindItems(...)
{
int total = result.paginationOutput.totalPages;
var tasks= new List<Task<IEnumerable<T>>>();
// start all tasks. don't wait for the result yet
for (int i = 2; i < total + 1; i++)
{
Task<IEnumerable<T>> task = Task.Factory.StartNew(() =>
{
return client.findItemsByProduct(i);
});
tasks.Add(task);
}
// now that all tasks are started, wait until all are finished
await Task.WhenAll(tasks);
// the result of each task is now in task.Result
// the type of result is IEnumerable<T>
// put all into one big list using some linq:
return tasks.SelectMany ( task => task.Result.SearchResult.Item)
.ToList();
// if you're not familiar to linq yet, use a foreach:
var newList = new List<T>();
foreach (var task in tasks)
{
newList.AddRange(task.Result.searchResult.item);
}
return newList;
}