Два новых ключевых слова, добавленных к языку C # 5.0, являются асинхронными и ожидающими, оба из которых работают рука об руку для асинхронного запуска метода C # без блокировки вызывающего потока.
, который получаетчерез цель функции, но она слишком много "кредитует" функцию асинхронного / ожидания.
Позвольте мне быть очень, очень ясно по этому вопросу: await
магическим образом не вызывает асинхронный запуск синхронного метода. Он не запускает новый поток и не запускает метод нановая тема, например.Метод, который вы вызываете, должен быть тем, кто знает, как выполнять себя асинхронно.То, как он решит это сделать, - это его дело.
Мой вопрос: действительно ли эти методы используют преимущества нескольких ядер и работают параллельно, или же асинхронный метод выполняется в том же ядре потока, что и вызывающая сторона??
Опять же, это полностью зависит от метода, который вы вызываете .Все, что делает await
, - это инструктирует компилятор переписать метод в делегат, который может быть передан как продолжение асинхронной задачи.То есть await FooAsync()
означает «вызов FooAsync()
», и все, что возвращается, должно быть чем-то, что представляет собой только что запущенную асинхронную операцию. Скажите этой вещи, что, когда она знает, что асинхронная операция выполнена, она должна вызвать этот делегат."У делегата есть свойство, что при его вызове текущий метод возобновляет работу «с того места, где он остановился».
Если метод, который вы вызываете, работает с другим потоком, привязанным к другому ядру, отлично.Если он запускает таймер, который пингует какой-то обработчик событий в будущем в потоке пользовательского интерфейса, отлично.await
не волнует.Все, что он делает, это гарантирует, что когда асинхронное задание выполнено, управление может возобновиться с того места, где оно было прервано.
Вопрос, который вы не задавали, но, вероятно, должен был задать:
Когдаасинхронная задача завершена, и управление начинает с того места, где оно было остановлено, выполняется ли выполнение в том же потоке, что и раньше?
Это зависит от контекста.В приложении winforms, где вы ожидаете чего-то из потока пользовательского интерфейса, управление снова запускается в потоке пользовательского интерфейса.В консольном приложении, возможно, нет.