Сортировка задач в порядке завершения
Я видел, как примерно год назад Джон Скит выступил с речью, в которой он показал фрагмент кода 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;
}
Кто-нибудь помнит, знает фрагмент, который яЯ имею в виду или как это можно улучшить?