Сортировка задач в порядке выполненияC#

Место общения программистов C#
Ответить
Anonymous
 Сортировка задач в порядке выполнения

Сообщение Anonymous »

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

Подробнее здесь: https://stackoverflow.com/questions/169 ... mpletition
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»