Что происходит с потоком `awaiting` в C # Async CTP?

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

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

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

И сек в конце концов (пока я привлекаю ваше внимание), я действительно не понимаю, почему асинхронные методы должны быть помечены async . Не может ли какой-либо метод выполняться асинхронно? Что, если я хочу выполнить метод асинхронно, но у него нет ключевого слова async - есть ли способ сделать это просто?

Ура. :)

Редактировать: По общему признанию, если бы я смог скомпилировать образец кода, я бы, вероятно, просто понял это сам, но по той или иной причине я наткнулся на блок там. Что я действительно хочу знать, так это до какой степени продолжается продолжение ... замораживает ли он весь стек вызовов, чтобы возобновить его, когда задача завершится, или оно возвращается только на данный момент? Должна ли сама функция быть помечена как асинхронная, чтобы поддерживать продолжение, или (как я изначально спросил) она продолжает весь стек вызовов?

Если она не замораживает весь стек вызовов? , что происходит, когда async await попадает в неасинхронную вызывающую функцию? Он там блокируется? Разве это не победило бы точку ожидания? Надеюсь, вы видите, что мне здесь не хватает понимания, которое, надеюсь, кто-то сможет восполнить, чтобы я мог продолжить изучение этого.

23
задан devios1 11 August 2011 в 22:23
поделиться