2016-02-15 5 views
0

У меня есть список асинхронных функций, которые я хочу выполнить по порядку. Когда я запускаю следующий код, я получаю вывод:Выполнять список задач async

Task 1 before 
Task 2 before 
Finished tasks 

Почему мои асинхронные функции не ожидаются правильно?

[Test] 
    public async Task AsyncTaskList() 
    { 
     var data = "I'm data"; 
     var tasks = new List<Func<object, Task>>() {Task1, Task2}; 

     tasks.ForEach(async task => 
     { 
      await task(data); 
     }); 

     Debug.WriteLine("Finished tasks"); 
    } 

    private static async Task Task1(object data) 
    { 
     Debug.WriteLine("Task 1 before"); 
     await Task.Delay(1000); 
     Debug.WriteLine("Task 1 after"); 
    } 

    private static async Task Task2(object data) 
    { 
     Debug.WriteLine("Task 2 before"); 
     await Task.Delay(1000); 
     Debug.WriteLine("Task 2 after"); 
    } 

ответ

3

Поскольку await внутри ForEach делегат фактически завершает после выходы метода. Измените его на фактический цикл foreach, и ожидание будет работать, как ожидалось.

ForEach не имеет конкретного обращения за Func<Task> (несколько делегатов-акцепторные методы в библиотеке базовых классов делать, и следует отметить, что они почти всегда возвращают Task сами). ForEach будет работать только часть вашего лямбда синхронное - и это часть предшествующей первой await в виде Task который не завершается синхронно (что Task.Delay в вашем случае). Вот почему вы видите сообщения «до», появляющиеся в ожидаемое время. Как только ваш делегат достигнет await Task.Delay, остаток вашего лямбда составляет , запланированный для запуска в будущем и ForEach переходит к следующему элементу в списке. После этого запланированные задачи продолжат незаметно и завершатся позже.

+0

Я пробовал это, но получаю тот же результат –

+0

На самом деле это работает, извините. Должно быть, я искал неправильный результат. Спасибо –

+0

@SimonTrewhella, без проблем. Я добавил более подробное объяснение. –

Смежные вопросы