it-roy-ru.com

Создает ли использование async/await новый поток?

Я новичок в TPL и мне интересно: как поддержка асинхронного программирования, которая является новой для C # 5.0 (через новые ключевые слова async и await), связана с созданием потоков?

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

35
dev hedgehog

Короче НЕТ

From Асинхронное программирование с использованием Async и Await: Threads

Ключевые слова async и await не приводят к созданию дополнительных потоков создано. Асинхронные методы не требуют многопоточности, потому что асинхронные метод не работает в своем собственном потоке. Метод работает на текущем контекст синхронизации и использует время в потоке, только когда метод активен. Вы можете использовать Task.Run для перемещения работы с процессором в фоновый поток, но фоновый поток не помогает с процессом это только ожидание результатов, чтобы стать доступными.

40
Adriaan Stander

Итак, я ознакомился с моделью потоков, и Async/Await, безусловно, может привести к использованию новых потоков (необязательно созданных - пул создает их при запуске приложения). Планировщик должен определить, нужен ли новый поток. И, как я понимаю, вызов ожидаемой функции может иметь внутренние детали, которые увеличивают шансы планировщика использовать другой поток; просто потому, что больше работы означает больше возможностей/причин для планировщика разделять работу.

Асинхронные операции WinRT автоматически выполняются в пуле потоков. И, как правило, вы будете вызывать FROM из пула потоков, за исключением работы потока пользовательского интерфейса. Xaml/Input/Events.

Асинхронные операции, запущенные в потоках Xaml/UI, возвращают свои результаты обратно в [вызывающий] поток пользовательского интерфейса. Но результаты асинхронной операции, запущенные из потока пула потоков, доставляются везде, где происходит завершение, что может быть не тем потоком, в котором вы были раньше. Причиной этого является то, что код, написанный для пула потоков, скорее всего, будет написан для обеспечения безопасности потоков, а также для эффективности, Windows не должна согласовывать этот переключатель потоков.

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

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

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

0
Gavin Williams