Вопрос о .Net Tasks и Async CTP - PullRequest
6 голосов
/ 03 июня 2011

Я экспериментирую с Async CTP и мне это очень нравится. У меня действительно был вопрос из документа, объясняющего это как бы то ни было. В нем говорится:

Важно понимать, что асинхронные методы, такие как ( пример метода, указанный в техническом документе ), не работают в своем собственном потоке.

Если они не работают в своем собственном потоке, как работает асинхронное поведение? Много ли переключений контекста в существующем потоке между (скажем) пользовательским интерфейсом и задачей, которую создает ключевое слово «await»?

Ответы [ 2 ]

5 голосов
/ 03 июня 2011

Когда вы вызываете асинхронный метод, он изначально синхронный.У него даже нет шансов быть асинхронным, пока он не достигнет ожидающего.

При каждом выражении ожидающего ожидания GetAwaiter() вызывается ожидающим, которого вы ожидаете.Затем свойство IsCompleted проверяется на ожидании.Если задача уже выполнена, метод продолжает работать синхронно.

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

точный характер потоковой обработки этого зависит от задействованного ожидающего, нов асинхронной CTP для Task<T> TaskAwaiter будет использовать текущий планировщик задач для планирования продолжения.Для WinForms / Silverlight / WPF это означает, что если вы запускаете асинхронный метод в потоке пользовательского интерфейса, он продолжается в потоке пользовательского интерфейса.В противном случае (например, если вы уже находитесь в потоке пула потоков или используете его из консольного приложения), продолжение будет выполняться в потоке пула потоков.Конечно, вы можете изменить текущий планировщик задач самостоятельно, если вы действительно хотите.

Аналогично, разные ожидающие не имеют для планирования продолжений, используя TaskScheduler.Current.Например, мои продолжения сопрограмм в основном сохраняют очередь продолжений для выполнения и продолжают идти, пока они не продолжатся.Мои продолжения ComeFrom оказались еще более причудливыми:)

Подробнее о том, как работает асинхронная функция под капотом, читайте в моей серии блогов Eduasync , которая довольно глубоко в нее углубляется.

Надеюсь, вам в целом нравится эта функция ... Я думаю, она невероятно увлекательна.

1 голос
/ 03 июня 2011

Идея асинхронного метода заключается в том, что он не требует запуска потока, он просто вызывает и присоединяет завершение асинхронного потока операций линейным способом. То есть если вы используете асинхронный метод для чтения из файла, он синхронно вызывает начальную часть файла для чтения и затем приостанавливается из выполнения (т. е. освобождает текущий поток для выполнения других операций) до завершения операции на уровне ОС и вызова предоставленного завершения , который не работает до конца вашего асинхронного метода (по крайней мере, до следующего ожидания).

...