Как C # 5 асинхронно возвращается в основной поток? - PullRequest
3 голосов
/ 13 апреля 2011

Я смотрел видео об Async CTP и увидел, что если вы вызываете await, например, из основного потока, то выполнение будет продолжено из основного потока, когда работа будет завершена.

например,

//called from main thread
var result = await SomeAsyncWork();
//this will execute in main thread also
console.writeline(result)

У меня было наивное впечатление, что будет нормальный обратный вызов, который будет выполняться в рабочем потоке.

На некотором уровне это должно быть тем, что происходит, поскольку вы можете переносить обычные асинхронные методыв Задаче T с Task.FromAsync

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

Ответы [ 2 ]

6 голосов
/ 13 апреля 2011

Обратный вызов прикрепляется к задаче с использованием текущего планировщика задач (это «текущий» на момент ожидания, а не текущий на момент завершения). Для потока пользовательского интерфейса текущий планировщик задач запланирует выполнение обратного вызова в потоке пользовательского интерфейса ... для потока пула потоков, планировщик разрешит его выполнение в любом потоке пула потоков и т. Д. .

Если вы ожидаете Task<T>, он фактически звонит Task<T>.ContinueWith(continuationAction, scheduler).

Вы можете ждать чего-либо с подходящими доступными методами, но то, как BeginAwait планирует продолжение, зависит от реализации. Я упомянул только задачу, потому что она, вероятно, самая распространенная. Сам компилятор не указывает это вообще - он предполагает, что библиотеки будут делать правильные вещи. Все, что делает компилятор, переводит «остальную часть метода» в продолжение и передает его в BeginAwait.

0 голосов
/ 04 мая 2011

Компилятор компилирует ваш код по-разному и разбивает его так, что код после ожидания становится обратным вызовом.Здесь есть подробное объяснение: http://evolpin.wordpress.com/2011/05/02/c-5-await-and-async-in-asp-net/

...