首页 > 解决方案 > 如何使用 C#8 IAsyncEnumerable异步枚举任务并行运行

问题描述

如果可能的话,我想为并行启动的任务创建一个异步枚举器。所以首先完成的是枚举的第一个元素,第二个完成的是枚举的第二个元素,依此类推。

public static async IAsyncEnumerable<T> ParallelEnumerateAsync(this IEnumerable<Task<T>> coldAsyncTasks)
{
    // ... 
}

我敢打赌,有一种使用ContinueWith和 a的方法Queue<T>,但我并不完全相信自己可以实现它。

标签: c#asynchronousasync-awaittask-parallel-libraryiasyncenumerable

解决方案


这是你要找的吗?

public static async IAsyncEnumerable<T> ParallelEnumerateAsync<T>(
    this IEnumerable<Task<T>> tasks)
{
    var remaining = new List<Task<T>>(tasks);

    while (remaining.Count != 0)
    {
        var task = await Task.WhenAny(remaining);
        remaining.Remove(task);
        yield return (await task);
    }
}

推荐阅读