Skip to main content

Async Parallel


static Task ParallelForEachAsync<T> (IEnumerable<T> source,
                                           int degreeofParallelization,
                                           Func<T, Task> body)
{
    async Task AwaitPartition(IEnumerator<T> partition)
	{
        using (partition)
        {
            while (partition.MoveNext())
            {
                await body(partition.Current);
            }
        }
    }
    return Task.WhenAll(Partitioner
                        .Create(source)
                        .GetPartitions(degreeofParallelization)
                        .AsParallel()
                        .Select(AwaitPartition));
}

Usage:

var tasks = Enumerable.Range(0, 10000).Select(_ => new Func<Task>(() => Worker(results))).ToList();

await ParallelForEachAsync(tasks, 1000, async func =>
{
	await func();
});