Я видел некоторые подобные вопросы раньше, просто хочу прояснить это.
В этой статье говорится, что для асинхронных вызовов нет потока.
Однако, в другом, говорится
Здесь, однако, выполнялся обратный вызов, чтобы обновить текст textBox1on в произвольном потоке, где реализована реализация ContinueWith параллельной библиотеки задач (TPL).
Кроме того, в некоторых случаях, когда я вызывал ContinueWith в моем проекте, я также получил исключение доступа к перекрестным потокам.
Итак, кто прав?
ОТВЕТ: благодаря i3arnon. После прочтения первой статьи более тщательно, я нашел это место
Итак, мы видим, что в то время как запрос находился в полете, не было ни одной нити. Когда запрос был завершен, различные потоки были "заимствованы" или работа была ненадолго поставлена в очередь. Эта работа обычно составляет порядка миллисекунды или около того (например, APC, запущенная в пуле потоков) вплоть до микросекунды или около того (например, ISR). Но нет нити, которая была заблокирована, просто ожидая завершения этого запроса.
Оба. Когда на вашем процессоре работает код, всегда работает поток. Вопрос в том, что происходит, когда у вас нет кода для запуска, например, когда вы ожидаете завершения операции ввода-вывода.
Если вы используете async await
когда не будет потока, ожидающего завершения этой операции, и только после того, как он завершит поток, будет предоставлен (обычно Thread Pool
), чтобы продолжить запуск кода на вашем CPU.
Если вы не используете async-await
(или другую асинхронную парадигму, такую как Begin-End
), вы будете держать поток на протяжении всей операции, даже в части IO, что является пустой тратой ресурсов.
Важно добавить, что хотя большинство асинхронных примеров относятся к операциям ввода-вывода, это не всегда так. В некоторых случаях целесообразно рассматривать операцию привязки к процессору (где вы выполняете нить на протяжении всей операции) асинхронно.
await
не использует потоки, и это полезно для IO. И если у меня есть некоторые вычисления, которые я должен сделать, я используюawait Task.Run()
для асинхронных вычислений в другом потоке.