2015-03-19 4 views
2

У меня возникли трудности с пониманием того, как использовать async и ждать работы.Async и ждут: несколько ожидающих выражений

Я понимаю, что когда метод async попадает в выражение ожидания, метод немедленно возвращается и в какой-то момент в будущем возвращается выражение ожидания и метод продолжает выполняться.

То, что я не понимаю, это то, что происходит, когда метод async содержит более одного ожидания ожидания? Когда выполнение попадает во второе выражение ожидания, поскольку метод уже был возвращен после того, как было найдено первое выражение ожидания, что происходит с выполнением второго выражения ожидания?

В настоящее время я читаю две книги о асинхронном режиме и жду, но мой темный ум не освещен ни тем, ни другим!

ответ

5

Я понимаю, что, когда метод async попадает в выражение ожидания, метод немедленно возвращается и в какой-то момент в будущем возвращается выражение ожидания и метод продолжает выполняться.

Да, если ожидаемый еще не завершен.

Когда выполнение попадает во второе выражение ожидания, так как метод уже возвращен после того, как было получено первое выражение ожидания, что происходит с выполнением вокруг второго выражения ожидания?

Он возвращает управление всем выполняемым продолжением, которое будет зависеть от контекста. В приложении WinForms в потоке пользовательского интерфейса это будет только цикл событий. В потоке пула потоков это будет просто планировщик пула потоков.

Шансы - это то, что вызывает продолжение, на самом деле это не волнует - это просто «что-то исполнить в контексте». Скорее всего, это будет продолжаться и просто выполнить все, что ему нужно сделать дальше (или дождаться, когда будет больше работы).

Важным моментом является то, что к настоящему времени первым абонент имеет соответствующий Task или Task<T> так, что они могут сказать, когда весь метод асинхронной завершен.

+0

Не ответ довольно просто: то же, что и с первым ожиданием. т.е. метод будет немедленно возвращаться ко второму пункту, если он уже не завершен, и в какой-то момент в будущем возвращается второе выражение ожидания, и метод продолжает выполнять еще раз. И это происходит для всех ожиданий, которые могут возникать последовательно в методе. –

+0

@PhilipStuyck: Дело в том, что OP смущен (я считаю), о том, что второй вызывающий абонент * *, к которому возвращается метод. –

+0

Итак, в то время как первый ожидает выполнения, код возвращается для завершения кода вызывающего абонента? В то время как во время второго ожидания управление возвращается к потоку пользовательского интерфейса или планировщику пула потоков? – serlingpa

1

Это может помочь вспомнить, что для каждого ждущего компилятора он перепишет остальную часть метода как продолжение. Таким образом, 2 Awaits привело бы к 2 (вложенных друг в друга) продолжений, примерно эквивалентно (хотя чрезмерно упрощенный), чтобы:

FirstAsyncThing().ContinueWith(x => { 
    SecondAsyncThing().ContinueWith(y => { 
     // etc. 
    }); 
}); 

Так же, как первый Await немедленно возвращает управление вызывающему методу, второй возвращает управление первым продолжение, который является первой частью исходного метода.

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