int total = result.paginationOutput.totalPages; for (int i = 2; i < total + 1; i++) { await Task.Factory.StartNew(() => { result = client.findItemsByProduct(i); }); newList.AddRange(result.searchResult.item); } } return newList; forEach item { result = item.makeWebRequest(); } foreach item { List.addRange(item.harvestResults); } var results = new ConcurrentBag(result.pagination.totalPages); using (var e = new CountdownEvent(result.pagination.totalPages)) { for (int i = 2; i <= result.pagination.totalPages+1; i++) { Task.Factory.StartNew(() => return client.findItemsByProduct(i)) .ContinueWith(items => { results.AddRange(items); e.Signal(); // signal task is done }); } // Wait for all requests to complete e.Wait(); } // Process results foreach (var item in results) { ... } public static Task Foo() { int total = result.paginationOutput.totalPages; var tasks = new List>(); for (int i = 2; i < total + 1; i++) { tasks.Add(Task.Factory.StartNew(() => client.findItemsByProduct(i))); } return Task.WhenAll(tasks); } int total = result.paginationOutput.totalPages; // Start all downloads; each download is represented by a task. Task[] tasks = Enumerable.Range(2, total - 1) .Select(i => client.findItemsByProductAsync(i)).ToArray(); // Wait for all downloads to complete. Item[][] results = await Task.WhenAll(tasks); // Flatten the results into a single collection. return results.SelectMany(x => x).ToArray();