Последний раз. Ожидается ли работа с потоками?

1

Я видел некоторые подобные вопросы раньше, просто хочу прояснить это.

В этой статье говорится, что для асинхронных вызовов нет потока.

Однако, в другом, говорится

Здесь, однако, выполнялся обратный вызов, чтобы обновить текст textBox1on в произвольном потоке, где реализована реализация ContinueWith параллельной библиотеки задач (TPL).

Кроме того, в некоторых случаях, когда я вызывал ContinueWith в моем проекте, я также получил исключение доступа к перекрестным потокам.

Итак, кто прав?

ОТВЕТ: благодаря i3arnon. После прочтения первой статьи более тщательно, я нашел это место

Итак, мы видим, что в то время как запрос находился в полете, не было ни одной нити. Когда запрос был завершен, различные потоки были "заимствованы" или работа была ненадолго поставлена в очередь. Эта работа обычно составляет порядка миллисекунды или около того (например, APC, запущенная в пуле потоков) вплоть до микросекунды или около того (например, ISR). Но нет нити, которая была заблокирована, просто ожидая завершения этого запроса.

Теги:
async-await
asynchronous
task
synchronization

1 ответ

7
Лучший ответ

Оба. Когда на вашем процессоре работает код, всегда работает поток. Вопрос в том, что происходит, когда у вас нет кода для запуска, например, когда вы ожидаете завершения операции ввода-вывода.

Если вы используете async await когда не будет потока, ожидающего завершения этой операции, и только после того, как он завершит поток, будет предоставлен (обычно Thread Pool), чтобы продолжить запуск кода на вашем CPU.

Если вы не используете async-await (или другую асинхронную парадигму, такую как Begin-End), вы будете держать поток на протяжении всей операции, даже в части IO, что является пустой тратой ресурсов.


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

  • 0
    Но .. я думал, что по умолчанию await не использует потоки, и это полезно для IO. И если у меня есть некоторые вычисления, которые я должен сделать, я использую await Task.Run() для асинхронных вычислений в другом потоке.
  • 0
    @VitaliiVasylenko ждать себя не так много. Он только регистрирует следующие строки кода как продолжение. Это означает, что вы не используете поток, пока ожидаете, но он вам нужен после того, как вы завершите ожидание выполнения остальной части кода.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню