Он использовал 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;
}
Подробнее здесь: https://stackoverflow.com/questions/169 ... mpletition
Мобильная версия