Сортировка задач в порядке завершения

Я видел, как примерно год назад Джон Скит выступил с речью, в которой он показал фрагмент кода C # 5, который возьмет список задач и вернет их в том порядке, в котором они были выполнены.

Он использовал async / await и WhenAny и был довольно красивым, но я могут на всю жизнь вспомни как это работало. Теперь мне это нужно.

Я надеюсь выяснить, как создать метод с сигнатурой, похожей на эту.

Task InOrderOfCompletion(IEnumerable tasks) where T : Task

И может быть использовано следующим образом: я '

public async Task DelayedInt(int i)
{
    await Task.Delay(i*100);
    return i;
}

[Test]
public async void Test()
{
    Task[] tasks = new[] {5, 7, 1, 3, 2, 6, 4}.Select(DelayedInt).ToArray();
    IEnumerable ordered = await InOrderOfCompletion(tasks);

    Assert.That(ordered.Select(t => t.Result).ToArray(), Is.EqualTo(new [] {1,2,3,4,5,6,7}));
}

мы придумали следующее, но это нечувствую себя так просто, как я помню

    async Task InOrderOfCompletion(IEnumerable tasks) where T : Task
    {
        HashSet taskSet = new HashSet(tasks);
        List results = new List();
        while(taskSet.Count > 0)
        {
            T complete = (T) await Task.WhenAny(taskSet);
            taskSet.Remove(complete);
            results.Add(complete);
        }
        return results;
    }

Кто-нибудь помнит, знает фрагмент, который яЯ имею в виду или как это можно улучшить?

Ответы на вопрос(1)

Ваш ответ на вопрос